Debian + Apache + SSLをActive Directory 証明書サービスで発行した証明書で動かす

Windows Server 2008 R2に証明書サービスをインストール。
ドメインに参加しているクライアントへの証明書の配布方法を調べました。

Windows Server 2008 R2に証明書サービスをインストールする
Active Directory 証明書サービスで発行したCA証明書の配布方法
Active Directory 証明書サービスでIIS7のSSL認証を構成する


ネットワーク内にLinux + Apacheなサーバーがあり、SSL通信したい場合、
せっかくだから構築したWindows Serverの証明書サービスを使いたいと思うのが人情かと。

証明書が配布済なので、ブラウザで表示しても警告が表示されませんし。


ということで、Linux + Apache + OpenSSLでWindows Serverの認証局から
発行した証明書を使う方法を調べて見ました。

ApacheにSSLを設定する事自体初めてだったので、地味に苦労しました。


今回は、Debianにインストールしてみます。






apacheとopensslのインストール



これがないと始まらないので、apacheとopensslをapt-getでインストールします。


# apt-get install apache2
# apt-get install openssl









秘密鍵の作成と、サーバー証明書のリクエスト作成



※とにかく動かすことに主眼を置いていますので、セキュリティ的な観点はゼロです。


まず、証明書を保存するフォルダを作成し、そこに移動します。
今回は、/etc/apache2/sslというフォルダを作成し、そこに必要なファイル一式を置くことにしました。


# mkdir /etc/apache2/ssl
# cd /etc/apache2/ssl





最初に秘密鍵を作成します。
コマンドは、


# openssl genrsa -des3 -out server.key 1024





実行時、パスワードの入力を求められますので、適当な値を入力します。


# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
............++++++
.....++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:(パスワードを入力)
Verifying - Enter pass phrase for server.key:(パスワードを再入力)



これで、「server.key」という秘密鍵が出来上がりました。





作成した秘密鍵を使用して、サーバー証明書のリクエストを作成します。
コマンドは、

# openssl req -new -key server.key -out server.csr





実行時、いくつか入力を求められますが、基本的にブランクでOKです。
ただ一箇所、「Common Name (eg, YOUR name) []:」のところは注意して、
このサーバーにhttps://でアクセスするときの名前を入力します。

今回、このサーバーには
https://debian.domain.local/
というURLでアクセスするつもりなので、「debian.domain.local」と入力しました。



# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:(server.keyを作成するときに入力したパスワード)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:debian.domain.local
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:    
An optional company name []:





これで、「server.csr」というファイルが作成されます。










Active Directory 証明書サービスに証明書の発行要求



ブラウザを起動し、
http://(証明書サービスを実行しているサーバー)/certsrv/
を表示します。

タスクの選択から、「証明書を要求する」をクリック。

87_001.png


証明書の要求画面では「証明書の要求の詳細設定を送信する。」をクリック。

87_002.png


証明書の要求または更新要求の送信では、
「保存された要求」のテキストエリアに、先ほどの手順で作成した「server.csr」の内容をコピー。
「証明書テンプレート」では、「Webサーバー」を選択します。

87_003.png


証明書が発行されました。
「Base64エンコード」を選択して、証明書のダウンロードを行います。

87_004.png


「certnew.cer」というファイルが取得できるかと思います。
これを/etc/apache2/sslにコピーします。


viなどのエディタで開いてみると、ファイルの改行コードがCRLFになっているのがわかるかと思います。

87_005.png


これを除去して、LFのみにしておきます。

87_006.png











apacheの設定



次にapacheの設定を行います。

a2enmod sslを実行して、sslモジュールを有効化。


# a2enmod ssl
Enabling module ssl.
See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
Run '/etc/init.d/apache2 restart' to activate new configuration!






/etc/apache2/sites-available/default-sslを編集して、
サーバーで作成した秘密鍵「server.key」
Windows認証局から発行してもらった「certnew.cer」
を指定します。

なお、証明書の要求に使用した「server.csr」はもう不要です。



エディタで/etc/apache2/sites-available/default-sslを開きます。


# vi /etc/apache2/sites-available/default-ssl




ServerNameを追加し、証明書を要求するとき「Common Name」に入力した値を設定します。
「SSLCertificateFile」に、認証局から発行してもらった「certnew.cer」
「SSLCertificateKeyFile」に、自分で作成した秘密鍵「server.key」を指定します。




<IfModule mod_ssl.c>
<VirtualHost _default_:443>
        ServerAdmin webmaster@localhost
        ServerName debian.domain.local:443

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>


(略)

        # SSL Engine Switch:
        # Enable/Disable SSL for this virtual host.
        SSLEngine on

        # A self-signed (snakeoil) certificate can be created by installing
        # the ssl-cert package. See
        # /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
        # If both key and certificate are stored in the same file, only the
        # SSLCertificateFile directive is needed.
        SSLCertificateFile    /etc/apache2/ssl/certnew.cer
        SSLCertificateKeyFile /etc/apache2/ssl/server.key

(略)






a2ensiteでサイトを有効化。


# a2ensite default-ssl
Enabling site default-ssl.
Run '/etc/init.d/apache2 reload' to activate new configuration!






apacheをリスタートします。
この時、サーバーで秘密鍵を作成するときに指定したパスワードの入力が求められます。


# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting Apache/2.2.16 mod_ssl/2.2.16 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server debian.domain.local:443 (RSA)
Enter pass phrase:(server.keyを作成するときに入力したパスワード)

OK: Pass Phrase Dialog successful.
.






ブラウザで、https://debian.domain.localを表示してみると、
見事証明書の警告なしで表示されました。

87_007.png


地味にはまっていたので、ほんとにIt works!だよと思いました・・・








apacheの起動時のパスワード入力回避




apacheを再起動するたびにパスワードの入力を求められるのは困る場合、
秘密鍵のパスワードを削除してしまいます。


コマンドは以下の通り。

openssl rsa -in server.key -out server-decoded.key






実行すると、秘密鍵を作成するときに指定したパスワードの入力を求められます。


# openssl rsa -in server.key -out server-decoded.key
Enter pass phrase for server.key:(server.keyを作成するときに入力したパスワード)
writing RSA key





これでパスワードが設定されていない秘密鍵「server-decoded.key」が作成出来ました。



apacheに仕込んでいきます。
a2dissiteで一旦サイトを無効化。


# a2dissite default-ssl
Site default-ssl disabled.
Run '/etc/init.d/apache2 reload' to activate new configuration!





/etc/apache2/sites-available/default-sslを編集して、
SSLCertificateKeyFileの指定を、先ほど作成したパスワードの設定されていない
「server-decoded.key」に変更します。


# vi /etc/apache2/sites-available/default-ssl

        SSLCertificateFile    /etc/apache2/ssl/certnew.cer
        SSLCertificateKeyFile /etc/apache2/ssl/server-decoded.key






再度、sslサイトを有効化。


# a2ensite default-ssl
Enabling site default-ssl.
Run '/etc/init.d/apache2 reload' to activate new configuration!





apacheを再起動してみると、パスワードの入力を求められることなく起動すると思います。


# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .










上手く動かないとき疑うべき点



最初、「Init: Private key not found」や「Unable to read server certificate」という
エラーがエラーログに出力され動いてくれず悩みました。


ちなみに、こんなログが/var/log/apache2/error.logに出力されます。


[error] Init: Private key not found
[error] SSL Library Error: 218710120 error:0D094068:asn1 encoding routines:d2i_ASN1_SET:bad tag
[error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
[error] SSL Library Error: 218734605 error:0D09A00D:asn1 encoding routines:d2i_PrivateKey:ASN1 lib








疑うポイント1

Windows認証局から発行してもらった「certnew.cer」の改行コードが
CRLFになっていると発生するかもしれません。

LFだけに変更すると上手くいくかもしれません。






疑うポイント2

情けない話なのですが、秘密鍵と証明書の指定を逆にしていました。

「SSLCertificateFile」に、認証局から発行してもらった「certnew.cer」
「SSLCertificateKeyFile」に、自分で作成した秘密鍵「server.key」



よくわからなくなったら・・・

「SSLCertificateFile」で指定するファイルは、
以下のコマンドで内容を確認できます。


# openssl x509 -noout -text -in certnew.cer




「SSLCertificateKeyFile」で指定するファイルは、
以下のコマンドで内容を確認できます。


# openssl rsa -noout -text -in server.key





指定するファイルが逆の場合は、こんなエラーが出力されます。


# openssl x509 -noout -text -in server.key
unable to load certificate
2165:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: TRUSTED CERTIFICATE





# openssl rsa -noout -text -in certnew.cer
unable to load Private Key
2166:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: ANY PRIVATE KEY





勉強になりました。





【参考URL】

Debian の Apache2 で SSL セットアップ
http://5net.com/blog/2004/11/debian-apache2-ssl.html

[Linux] Debian Etch で Apache2.2 + SSL
http://www.in-vitro.jp/blog/index.cgi/Linux/20070419_01.html

■[linux]Debian etchでSSL
http://d.hatena.ne.jp/rudeboyjet/20070124/p1

Securing Apache using mod_ssl,OpenSSL and Microsoft certificate authority(CA)
http://blog.netnerds.net/2009/10/securing-apache-using-mod_ssl-openssl-and-microsoft-certificate-authority-ca/

How do I use a microsoft certificate on apache?
http://www.linuxquestions.org/questions/linux-security-4/how-do-i-use-a-microsoft-certificate-on-apache-328855/

OpenSSL証明書操作/VeriSign
http://d.hatena.ne.jp/stereocat/20090509/1241845352

SSL証明書
http://missinglink.ddo.jp/wiki/index.php?SSL%E8%A8%BC%E6%98%8E%E6%9B%B8

Linux (OpenSSL) でサーバ証明書をリクエストして、Windows Server 2003 の CA から発行する
http://www.nire.com/2008/03/linux-certification-by-windows-2003/

ApacheでSSLを使うには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/702apachessl.html






関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ