PKIはPublic Key Infrastractureの略で公開鍵を認証するしくみです。 PKIでは認証局(CA: Certificate Authority)が公開鍵に署名をし、その公開鍵の身元を保証します。 公開鍵を渡された人はそれが正しいものか偽装されたものかを認証局に問い合わせることで判断することができます。 認証局はVeriSign社などの広く認知されている会社などが運営している場合もありますが、個人で運営することもできます。
公開鍵暗号を用いてインターネットの通信を暗号化する方法がSSL(Secure Socket Layer)またはTLS(Transport Layer Security)プロトコルです。 SSLではサーバーが認証局で署名された公開鍵をクライアントに送信し、クライアントで公開鍵を確認したあと共通鍵暗号方式の鍵を作成しサーバーの公開鍵で暗号化して送り返します。 以後の通信ではでこの作成した鍵を用いて暗号化と復号化を行い通信します。
自宅サーバーではウェブやメールのサーバーを運営していますが、これらとユーザーの通信を暗号化する(したい)ことがあります。 サーバーの証明書を作成し、自前で認証局を運営して安全な通信を行うことができます。
PKIの認証局を作成します。といっても認証局自身の秘密鍵、公開鍵を作成するだけです。
SSLに必要なものはすべてopensslに含まれています。opensslをインストールすると /etc/pki 以下に認証局の鍵をおく場所ができます。opensslの設定ファイルは /etc/pki/tls/openssl.cnf です。以下に修正した項目を記します。
証明書の作成時に尋ねられるCountry Nameなどのデフォルト値を設定しておいてもいいかもしれません。
[ CA_default ] default_days = 1825 [ req_distinguished_name ] countryName_default = JP stateOrProvinceName_default = Aichi localityName_default = Nagoya 0.organizationName_default = Takamasa Home [ usr_cert ] basicConstraints=CA:TRUE nsCertType = server [ v3_ca ] nsCertType = sslCA, emailCA
以下のようにして認証局に必要な鍵を作成します。
# cd /etc/pki/tls/misc/ # ./CA -newca CA certificate filename (or enter to create) # enter キーを押して新しく作成する Making CA certificate ... Generating a 1024 bit RSA private key .......................................++++++ .....++++++ writing new private key to '../../CA/private/./cakey.pem' Enter PEM pass phrase: # cakey.pemを保護するためにパスワードを設定 Verifying - Enter PEM pass phrase: # もう一度 ----- 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) [JP]: State or Province Name (full name) [Aichi]: Locality Name (eg, city) [Nagoya]: Organization Name (eg, company) [Takamasa Home]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:Private CA Email Address []:root@thaliana.myhome.cx Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/pki/tls/openssl.cnf Enter pass phrase for ../../CA/private/./cakey.pem: # CAの証明書にcakey.pemで署名を入れるために先に 設定したcakey.pemのパスワードを入力する Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Jan 2 14:33:15 2009 GMT Not After : Dec 31 14:33:15 2018 GMT Subject: countryName = JP stateOrProvinceName = Aichi organizationName = Takamasa Home commonName = Private CA emailAddress = root@thaliana.myhome.cx X509v3 extensions: X509v3 Basic Constraints: CA:TRUE Netscape Cert Type: SSL Server Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: D2:83:2F:8E:EE:DC:C2:7E:BE:0C:B9:38:F1:35:8E:2F:AF:C3:A0:AC X509v3 Authority Key Identifier: keyid:D2:83:2F:8E:EE:DC:C2:7E:BE:0C:B9:38:F1:35:8E:2F:AF:C3:A0:AC Certificate is to be certified until Dec 31 14:33:15 2018 GMT (3650 days) Write out database with 1 new entries Data Base Updated
以上で /etc/pki/CA 以下に認証局に必要なファイルが作成されました。特に重要なのが /etc/pki/CA/private/cakey.pem で、これが認証局の秘密鍵です。この秘密鍵は途中入力したパスフレーズにより保護されていますが、よりいっそうの安全を期すにはUSBメモリなどの外部記憶装置に移して(コピーではない)おくといいでしょう。
/etc/pki/CA/careq.pem が自己署名前の公開鍵で、これに cakey.pem で署名したのが /etc/pki/CA/cacert.pem です。公開鍵は署名されないと信用されないので作成直後はreq(uest)となっていて、署名するとcert(ificate)となるようです。cakey.pem、careq.pem、cacert.pemのいずれもPEM形式のファイルなので拡張子がpemとなっています。PEMはPrivary Enhanced Mailの省略で元々はメールを暗号化するための形式で、テキストファイルです。
証明書が間違っていないか、改ざんされていないかを確認するために鍵のハッシュ値が用いられます。認証局の証明書(cacert.pem)のハッシュ値は openssl x509 -sha1 -noout -fingerprint -in /etc/pki/CA/cacert.pem で求められます。ちなみにthaliana.myhome.cxのCAのハッシュ値は F9:11:EC:4D:E8:40:59:CE:D8:3D:FA:10:24:88:FB:28:88:9A:FC:D2 となっています。
自分の認証局の証明書をクライアントへインストールします。
Windowsは拡張子がpemのファイルでは証明書として認識されないのでcacert.pemをca.crtなどの名前で保存します。このファイルをダブルクリックで開くと証明書の情報が表示されます。「詳細」タブを開くと証明書の内容が表示されます。拇印の値を確認します。
「全般」タブに戻り、「証明書のインストール」をクリックします。証明書ストアで「証明書をすべて次のストアに配置する」を選択し、「信頼されたルート証明機関」を証明書ストアに選択します。
/etc/pki/CA/cacert.pemをブラウザーでアクセスできる場所にcrtという拡張子をつけて保存します。そしてこのファイルにブラウザーからアクセスすると「証明書のインポート」が始まります。「証明書を表示」をクリックしてSHA1フィンガープリントを確認します。
「この認証局による...」はすべてチェックし、OKをクリックします。
各種サーバー(httpdとかimapd)が使用するサーバー証明書(認証局により署名された公開鍵)を作成します。
まず秘密鍵と公開鍵を作成します。
# cd /etc/pki/tls/misc/
# ./CA -newreq
Generating a 1024 bit RSA private key
.....................................++++++
...............................................................................................................................................++++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
(省略)
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Aichi]:
Locality Name (eg, city) [Nagoya]:
Organization Name (eg, company) [Takamasa Home]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:thaliana.myhome.cx # 使用するサーバーと同じ名前(FQDN)にする
Email Address []:root@thaliana.myhome.cx
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
秘密鍵(newkey.pem)と公開鍵(newreq.pem)が作成されました。続いてこの公開鍵を認証局で署名します。
# ./CA -sign
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ../../CA/private/cakey.pem: # 認証局の秘密鍵のパスフレーズを入力する
Check that the request matches the signature
Signature ok
(省略)
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 26 07:42:03 2008 GMT
Not After : Dec 26 07:42:03 2009 GMT
Subject:
countryName = JP
stateOrProvinceName = Aichi
localityName = Nagoya
organizationName = Takamasa Home
organizationalUnitName = mail
commonName = thaliana.myhome.cx
emailAddress = postmaster@thaliana.myhome.cx
X509v3 extensions:
(省略)
Certificate is to be certified until Dec 26 07:42:03 2009 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
Certificate:
(省略)
-----BEGIN CERTIFICATE-----
MIIDLzCCApigAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMCSlAx
(省略)
Luzx
-----END CERTIFICATE-----
Signed certificate is in newcert.pem
認証局に署名された証明書(newcert.pem)が作成されました。
作成した秘密鍵にかかっているパスワードをはずします。パスワードをはずしたファイルをサーバーの鍵ファイルとして以後使用します。
# openssl rsa -in newkey.pem -out /etc/pki/tls/private/thaliana.myhome.cx.key Enter pass phrase for newkey.pem: writing RSA key # chmod 400 /etc/pki/tls/private/thaliana.myhome.cx.key
できた証明書に名前をつけて保存します。
# mv newcert.pem /etc/pki/tls/certs/thaliana.myhome.cx.crt
なぜか最初につくったサーバー証明書はシリアル番号が重なっていけないというエラーがでるので./CA -newreqをもう一度行ってつくるとよい。
SSLCertificateFile /etc/pki/tls/certs/thaliana.myhome.cx.crt SSLCertificateKeyFile /etc/pki/tls/private/thaliana.myhome.cx.key
smtpd_tls_cert_file = /etc/pki/tls/certs/thaliana.myhome.cx.crt smtpd_tls_key_file = /etc/pki/tls/private/thaliana.myhome.cx.key
ssl_cert_file = /etc/pki/tls/certs/thaliana.myhome.cx.crt ssl_key_file = /etc/pki/tls/private/thaliana.myhome.cx.key