momoto.github.io

Apache HTTP ServerのSSL/TLSサポートを有効化する

 mod_sslをつかってApache HTTP ServerのSSL/TLSサポートを有効化します。 SSLを有効にするために必要なRSA秘密鍵と公開鍵証明書のうち、公開鍵証明書は第三者の認証局に署名してもらうのが通常ですが、この記事では検証のため自己発行証明書をつかいます。

 手順としては(1) RSA秘密鍵を生成、(2) 証明書署名要求(CSR)を作成、(3) 公開鍵証明書を発行、その後、ウェブサーバでSSL/TLSを設定します。(3)の「公開鍵証明書の発行」は本来、認証局で行う手順です。

  1. OpenSSLをつかってRSA秘密鍵と証明書署名要求を用意する(申請者)

     RSA秘密鍵の生成にはopenssl genrsa -out <秘密鍵ファイル名> <鍵長>のコマンドをつかいます。

    $ openssl genrsa -out localhost.key 2048
    Generating RSA private key, 2048 bit long modulus
    ...................................................+++
    ...............+++
    e is 65537 (0x10001)
    

     2013年9月現在、1024bit鍵長のCSRの受付を停止した認証局もあるように、鍵長は2048bitが一般的であるようです。

     openssl genrsaのオプションによって、生成したRSA秘密鍵を別の暗号方式で暗号化することや、乱数生成につかわれるシード値をファイルで指定することもできます。 RSA秘密鍵をAESやDESなどの共通鍵暗号方式で暗号化する場合は秘密鍵にパスフレーズを設定します。このパスフレーズはウェブサーバの起動時や証明書署名要求ファイル作成時に入力が必要になります。

     続いて、RSA秘密鍵をもとに証明書署名要求ファイルを作成します。OpenSSLコマンドはopenssl req -new -key <秘密鍵ファイル名> -out <証明書署名要求ファイル名>をつかいます。 CSRの作成にはディスティングイッシュネームの入力が必要です。

    $ openssl req -new -key localhost.key -out localhost.csr
    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) [XX]:JP
    State or Province Name (full name) []:Tokyo
    Locality Name (eg, city) [Default City]:Shinjuku
    Organization Name (eg, company) [Default Company Ltd]:Localhost, Local Area Network
    Organizational Unit Name (eg, section) []:
    Common Name (eg, your name or your server's hostname) []:localhost
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    
  2. 公開鍵証明書を発行する(認証局)

     証明書署名要求ファイルと認証局の私有鍵をもとに公開鍵証明書を発行します。 OpenSSLコマンドはopenssl ca -in <証明書署名要求ファイル名> -out <公開鍵証明書ファイル名>をつかいます。

    $ openssl ca -in localhost.csr -out localhost.self-signed.crt
    Using configuration from /etc/pki/tls/openssl.cnf
    Enter pass phrase for /etc/pki/CA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number:
                ec:65:47:48:ff:6d:ff:cc
            Validity
                Not Before: Sep  7 00:00:00 2013 GMT
                Not After : Sep  7 00:00:00 2014 GMT
            Subject:
                countryName               = JP
                stateOrProvinceName       = Tokyo
                organizationName          = Localhost, Local Area Network
                commonName                = localhost
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:TRUE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    02:B3:E2:99:8B:C9:E8:F2:33:A7:27:1B:FD:D6:9E:64:C9:12:D2:7E
                X509v3 Authority Key Identifier:
                    keyid:15:F3:B6:82:FD:BB:41:AF:F2:AE:D9:BD:E1:C0:2E:B6:A5:23:C6:FA
    
    Certificate is to be certified until Sep  7 00:00:00 2014 GMT (365 days)
    Sign the certificate? [y/n]:y
    
    
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
    

     認証局は発行した公開鍵証明書を申請者に渡して、申請者は公開鍵証明書をウェブサーバに移動します。

  3. mod_sslを設定する(Apache HTTP Server)

     www.modssl.orgやディストリビューションからmod_sslをインストールします。

    $ sudo yum install mod_ssl
    

     上記の手順で用意したRSA秘密鍵と公開鍵証明書を、Apache実行ユーザが読み込めるファイルパスに設置します。同様にパーミッションも適宜、設定します。

    $ sudo mv localhost.key /etc/pki/tls/private/
    $ sudo mv localhost.self-signed.crt /etc/pki/tls/certs/
    $ sudo chmod 0600 /etc/pki/tls/certs/localhost.self-signed.crt
    $ sudo chmod 0600 /etc/pki/tls/private/localhost.key
    

     Apacheの設定ファイル(<ServerRoot>/conf.d/ssl.confなど)を編集して、SSLCertificateFileディレクティブとSSLCertificateKeyFileディレクティブを設定します。

    SSLCertificateFile /etc/pki/tls/certs/localhost.self-signed.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    

     Apacheを再起動します。RSA秘密鍵を暗号化している場合はパスフレーズの入力が必要です。

    $ sudo apachectl -t
    Syntax OK
    $ sudo /etc/init.d/httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd: Apache/2.2.15 mod_ssl/2.2.15 (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 localhost:443 (RSA)
    Enter pass phrase:
    
    OK: Pass Phrase Dialog successful.
                                                               [  OK  ]
    

 ウェブサーバにアクセスしてみると、発行者不明(sec_error_unknown_issuer)のため接続を信頼されていませんが、接続は暗号化されているようです。

 証明書情報を表示すると入力したディスティングイッシュネームを確認することができます。また、この記事の例では主体者と発行者が同一になっていることも確認できます。

参考