SSLによる通信の暗号化 - careerbeat/dit-ehime GitHub Wiki

SSLによる通信の暗号化

セキュアな通信を確保するために、SSLによる通信の暗号化を行う

1. opensslのインストール

[root@dojo ~]# yum -y install openssl

2. 認証局(CA)の作成

自身で認証局(CA)を構築する

[root@dojo ~]# /etc/pki/tls/misc/CA -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 2048 bit RSA private key
・・・
(略)
・・・
Write out database with 1 new entries
Data Base Updated

途中入力項目がいくつかあるので、適切な値を入力する 以下に今回入力したデータを記載する

入力項目 意味 入力内容
CA certificate filename(or enter to create) CAファイルを置く場所 Enter
Enter PEM pass phrase: CAの秘密鍵パスワード パスワード
Verifying - Enter PEM pass phrase: CAの秘密鍵パスワードの確認 パスワード
Country Name(2 letter code)[XX]: 国名 JP
State or Province Name (full name)[]: 都道府県 Ehime
Locality Name (eg, city) [Default City]: 市区町村名 Matsuyama
Organization Name (eg, company)[Default Company Ltd]: 組織名 Aso.alpha.jp
Organizational Unit Name (eg, section) []: 担当部署名 AsoSystem
Common Name (eg, your name or your server's hostname) []: ホスト名 x.x.x.41
Email Address []: メールアドレス Enter
A challenge password []: 証明書を破棄する際に必要となるパスワード Enter
An optional company name []: 組織名の略称 Enter
Enter pass phrase for /etc/pki/CA/private/./cakey.pem: CAの秘密鍵のパスワード パスワード

作成されたCA証明書は以下の場所に保存されている

名称 場所
公開鍵 /etc/pki/CA/private/cacert.pem
CA秘密鍵 /etc/pki/CA/private/cakey.pem

3.サーバ証明書の秘密鍵作成

秘密鍵を保存するためのディレクトリを作成し、そこで鍵生成を行う

[root@dojo ~]# mkdir /etc/pki/ssl
[root@dojo ~]# cd /etc/pki/ssl

[root@dojo ssl]# openssl genrsa -out server.key -aes256 2048
Generating RSA private key, 2048 bit long modulus
...................................+++
...................................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
入力項目 意味 入力内容
Enter pass phrase for server.key: 秘密鍵のパスワード パスワード
Verifying - Enter pass phrase for server.key: パスワードの確認 パスワード

以上の設定で、認証局を構築することができた

4. サーバ証明書作成

サービスで実際に使用する鍵を生成する

[root@dojo ssl]# openssl req -new -key server.key -out server.csr
Enter pass phrase for 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.
(略)
・・・
入力項目 意味 入力内容
Enter pass phrase for server.key: サーバー秘密鍵のパスワード パスワード
Country Name (2 letter code) [XX]: 国名 JP
State or Province Name (full name) []: 都道府県名 Ehime
Locality Name (eg, city) [Default City]: 市区町村名 Matsuyama
Organization Name (eg, company) [Default Company Ltd]: 組織名 Asoalpha.jp
Organizational Unit Name (eg, section) []: 担当部署名 AsoSystem
Common Name (eg, your name or your server's hostname) []: ホスト名 x.x.x.41
Email Address []: メールアドレス Enter
A challenge password []: 証明書を破棄する際に必要となるパスワード Enter
An optional company name []: 組織名の略称 Enter

5. サーバ証明書へのCAの署名

サーバ証明書へのCAの署名をし、SSL証明書を作成する

[root@dojo ssl]# openssl ca -config /etc/pki/tls/openssl.cnf -in server.csr -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem -out server.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
The organizationName field needed to be the same in the
CA certificate (Aso.alpha.jp) and the request (Asoalpha.jp)

CAのOrganizationNameが違うため、SSL証明書が作成できなかった サーバ証明書を作り直す


サーバ証明書の作り直し

4.と同様の作業を行う Organization Nameを統一させるため、Aso.alpha.jpとして作成する

[root@dojo ssl]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
・・・
(略)
・・・
Organization Name (eg, company) [Default Company Ltd]:Aso.alpha.jp
(略)

再度、署名をする

[root@dojo ssl]# openssl ca -config /etc/pki/tls/openssl.cnf -in server.csr -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem -out server.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
・・・
(略)
・・・
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2

エラーが出たので 証明書の要求をrevokeする

[root@dojo ssl]# openssl ca -revoke /etc/pki/CA/newcerts/A48A38AD79BA87F1.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Revoking Certificate A48A38AD79BA87F1.
Data Base Updated

それでもエラーが出る場合は、/etc/pki/CA/index.txt の内容を削除する

再々度、署名をする

[root@dojo ssl]# openssl ca -config /etc/pki/tls/openssl.cnf -in server.csr -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem -out server.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 is to be certified until Jun 25 02:05:46 2027 GMT (3650 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

問題なく署名できたので、作業を進める


最後に、それぞれの鍵が生成できているのか確認をする

秘密鍵の確認

[root@dojo ssl]# openssl rsa -in server.key -text

CSR(署名要求書)の確認

[root@dojo ssl]# openssl req -in server.csr -text

証明書の確認

[root@dojo ssl]# openssl x509 -in server.crt -text

6. クライアントへの証明書の配布

ApacheをSSL対応するために必要な、mod_sslのインストールをする

[root@dojo ssl]# yum install mod_ssl

SSL証明書の設定をする

[root@dojo ssl]# vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/ssl/server.crt
SSLCertificateKeyFile /etc/pki/ssl/server.key

httpdの再起動

[root@dojo CA]# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: httpd: apr_sockaddr_info_get() failed for dojo.local
・・・
(略)
・・・
Enter pass phrase:
OK: Pass Phrase Dialog successful.
                                                           [  OK  ]

Webブラウザが受け入れることのできるSSL証明書の書式はPEMとDERの2種類であるので、DERを生成する

[root@dojo html]# openssl x509 -in cacert.pem -inform PEM -out cacert.der -outform DER

作成したファイルをvar/www/html/へコピー

[root@dojo ssl]# cp cacert.der /var/www/html/
[root@dojo ssl]# cp cacert.pem /var/www/html/

PEMとDERが証明書であることを認識させるために、Apache の mime.typesの設定を変更する

[root@dojo ssl]# vim /etc/mime.types
AddType application/x-x509-ca-cert .der

クライアントからfirefoxで"x.x.x.41/cacert.der"へアクセスすると、信頼するかどうかの確認画面が出る 認証後、https通信が行えるようになることが確認できる

一覧に戻る


参考

CentOS6.5 OpenSSLでオレオレ認証局 $yuzu->log(); OpenSSLでオレオレSSL証明書の作成ログ