SSL証明書

シマンテック(旧ベリサイン)等の認証局から、署名付きの証明書を発行してもらうには費用がかかります。
そもそもCA(Certification Authority)キーが予めブラウザ側に登録されていないといけませんが 独自でCAの証明書を発行し、認証することも可能です。

シマンテック(旧ベリサイン)等の認証局から、署名付きの証明書を発行してもらう。
CSR(署名要求:Certificate Signing Request)を作成する。
オンライン申請システムにCSRを貼り付けて証明書を発行。
証明書をダウンロードする。
という流れになります。

無償で SSL/TLS 証明書を発行してくれるサービス

Let’s Encrypt 正式版としてリリースされました。
自動で証明書の更新ができ、Web サーバーを停止することなく証明書を取得できるようになったようです。
 → certbotのコマンドがhttpdの停止・開始をしていました。
# yum -y --enablerepo=epel install python-certbot-apache
# certbot --apache certonly
証明書や秘密鍵は「/etc/letsencrypt/archive/」以下に保存され、
/etc/letsencrypt/live/<ドメイン名>/ 配下にシンボリックリンクが出来ます。
これをssl.conに反映してhttpdリスタート 簡単にいけました。

サーバー証明書
/etc/letsencrypt/live/<ドメイン名>/cert.pem
証明書+中間CA証明書
/etc/letsencrypt/live/<ドメイン名>/fullchain.pem
サーバー秘密鍵
/etc/letsencrypt/live/<ドメイン名>/privkey.pem
中間CA証明書
/etc/letsencrypt/live/<ドメイン名>/chain.pem

但し、これは自身がグローバルIPを持っている場合です。ローカルIPでNAT環境ではだめでした。
# systemctl stop apache2
# certbot certonly --standalone
/etc/letsencrypt/live/domain/ 配下に作成されるので反映して
# systemctl start apache2


※<ドメイン名>はFQDNです。

 アップデートはcron登録すればOK
 cron登録の例
 #!/bin/sh
 systemctl stop httpd
 sleep 5
 certbot renew
 systemctl start httpd
 exit
 実行権限を付けるのを忘れずに
 # chmod +x certbot.sh
------------------------------------------------------------
cron登録の例
Certbotのサンプルでは毎日実行する例が掲載されていました。
/etc/cron.d/certbot
0 0,12 * * * root /bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

以上で完了です。
StartCom ついに解散
StartComは、会社を解散することに決めたようです。
2018年1月1日から新しい証明書の発行を停止し、さらに2年間はCRLおよびOCSPサービスのみを提供とのことです。
StartSSL リニューアルされていました。
ユーザー登録してドメインの認証、公開鍵の発行となります。
注意が必要なのはログイン用のクライアント認証キーをエクスポートしておく事でした。
これがないと従来はログイン出来なくなりましたが「One Time Password Login」が可能になっています。
他のPCやブラウザに認証キーをインポートすればログインがスムーズに出来るようになります。
署名もSHA2(SHA256RSA)となり、期間も3年になっていますので便利になりました。
Class 1 DV SSL Certificate になってブラウザで緑色表示されるようになります。

※重要情報
2017/03/03 取得したキーだとIEはOKだがFirefox、chromはNG。iPhoneやAndroidも警告表示でて閲覧できません。 調べてみると
2016年10月24日付 StartCom は日付の改ざんされた SHA-1 証明書であり、当該ルート証明書を Mozilla は即座に、かつ永久的に失効させることとします。
との事です
もう使わない方がよさそうです。2016年10月24日以前に取得した証明書は表示可能なのですが、

「Let’s Encrypt」に切り替えました。

独自SSLサーバ認証局(CA局)の作成

Verisign等の認証機関と契約する程ではないがSSLしたい。
自分自身がCA局になっちゃえばいい縲怩ナす。 いわゆるオレオレ証明書

opensslの事前準備

下記のようにしておくと便利です。

# vi /etc/pki/tls/openssl.cnf
default_days = 1825
countryName_default = JP
stateOrProvinceName_default = Tokyo
localityName_default = Minato-ku
0.organizationName_default = Private
commonName_default = Top Tree Name
emailAddress_default = admin@domain-name
独自CAキーの作成

opensslを導入すると便利なキー作成ユーティリティがありますのでこれを使って作成する事にします。

# /etc/pki/tls/misc/CA -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 2048 bit RSA private key
..........................+++
.....................................................+++
writing new private key to '/etc/pki/CA/private/./cakey.pem'
Enter PEM pass phrase:XXXXXXXX
Verifying - Enter PEM pass phrase:XXXXXXXX
-----
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) [Tokyo]:
Locality Name (eg, city) [Minato-ku]:
Organization Name (eg, company) [Private]:
Organizational Unit Name (eg, section) [Team]:
Common Name (eg, your name or your server's hostname) [Top Tree Name]:
Email Address [admin@domain-name]:

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 /etc/pki/CA/private/./cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 12906919081236529653 (0xb31e968545d081f5)
Validity
Not Before: Aug 31 13:09:08 2017 GMT
Not After : Aug 30 13:09:08 2020 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = Private
organizationalUnitName = Team
commonName = Top Tree Name
emailAddress = admin@domain-name
X509v3 extensions:
X509v3 Subject Key Identifier:
DE:57:53:90:AB:7C:06:9D:8C:FD:3D:9F:74:76:15:15:29:B9:09:34
X509v3 Authority Key Identifier:
keyid:DE:57:53:90:AB:7C:06:9D:8C:FD:3D:9F:74:76:15:15:29:B9:09:34

X509v3 Basic Constraints:
CA:TRUE
Certificate is to be certified until Aug 30 13:09:08 2020 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
鍵ペアと証明書要求キー(CSR)を作成

認証要求キー(CSR)の作成を行ないます、これは通常認証機関に提出するキーです。

# /etc/pki/tls/misc/CA -newreq
Generating a 2048 bit RSA private key
.......................................+++
.................................+++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:YYYYYYYY
Verifying - Enter PEM pass phrase:YYYYYYYY
----- 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) [Tokyo]:
Locality Name (eg, city) [Minato-ku]:
Organization Name (eg, company) [Private]:
Organizational Unit Name (eg, section) [Team]:
Common Name (eg, your name or your server's hostname) [Top Tree Name]:www.hoge.com
Email Address [admin@domain-name]:

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
独自CA局で署名

CAキーで認証要求キーへの署名をしてあげます。

# /etc/pki/tls/misc/CA -sign
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:XXXXXXXX
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 12906919081236529654 (0xb31e968545d081f6)
Validity
Not Before: Aug 31 13:26:03 2017 GMT
Not After : Aug 30 13:26:03 2022 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
localityName = Minato-ku
organizationName = Private
organizationalUnitName = Team
commonName = www.hoge.com
emailAddress = admin@domain-name
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
86:94:B2:1F:6C:5F:B2:EB:02:7B:40:89:77:80:12:D3:02:F7:E5:7F
X509v3 Authority Key Identifier:
keyid:DE:57:53:90:AB:7C:06:9D:8C:FD:3D:9F:74:76:15:15:29:B9:09:34

Certificate is to be certified until Aug 30 13:26:03 2022 GMT (1825 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:
Data:
Version: 3 (0x2)
Serial Number: 12906919081236529654 (0xb31e968545d081f6)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Tokyo, O=Private, OU=Team, CN=Top Tree Name/emailAddress=admin@domain-name
Validity
Not Before: Aug 31 13:26:03 2017 GMT
Not After : Aug 30 13:26:03 2022 GMT
Subject: C=JP, ST=Tokyo, L=Minato-ku, O=Private, OU=Team, CN=www.hoge.com/emailAddress=admin@domain-name
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d8:f5:e1:e5:40:36:ba:0d:29:a3:82:48:7c:df:
34:10:f6:0d:fa:16:79:c9:99:f3:6f:ee:80:42:3c:
b8:7c:a9:d7:33:70:7e:b7:03:7c:c0:25:3e:8c:10:
02:c3:05:c5:c3:a3:6b:ec:a5:f1:4f:ce:f1:97:67:
52:a7:83:8b:6f:c9:7f:04:c5:cd:00:c0:53:85:df:
6f:bc:c3:5c:46:62:0c:5d:d0:89:71:9b:7a:2e:37:
f1:d6:de:52:3c:07:bd:cf:21:9a:1d:95:24:27:22:
0c:4a:33:97:49:14:cf:da:a4:6b:50:94:39:f4:ee:
fb:89:c9:be:66:9b:a4:da:64:e9:a2:21:e3:f8:61:
75:1c:57:01:ec:5b:cf:da:e4:78:cf:db:16:9b:3e:
38:01:56:e2:dd:e1:c0:79:5a:19:97:b6:52:25:3b:
63:0c:9f:6b:77:7e:fe:2a:a9:0e:9d:49:e7:f6:91:
b6:43:b2:e7:0d:97:fa:a2:68:2a:33:ed:ca:10:08:
09:13:77:19:97:d7:84:55:bc:d5:c2:23:6b:96:b2:
9a:71:58:71:4e:b4:e0:3d:c0:d3:ce:fc:72:46:44:
e7:5d:44:9c:7f:65:16:9f:5d:e1:02:35:02:f5:46:
b6:25:35:81:61:e0:7b:dd:0e:f2:39:7f:2f:f7:4e:
f3:c1
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
86:94:B2:1F:6C:5F:B2:EB:02:7B:40:89:77:80:12:D3:02:F7:E5:7F
X509v3 Authority Key Identifier:
keyid:DE:57:53:90:AB:7C:06:9D:8C:FD:3D:9F:74:76:15:15:29:B9:09:34

Signature Algorithm: sha256WithRSAEncryption
9c:37:aa:da:5b:7e:9b:bd:6b:f0:83:3b:54:0a:65:66:25:da:
85:c8:2f:28:cb:33:5a:29:43:a8:df:4d:d8:fb:69:71:d7:ef:
15:ee:a4:9d:e7:56:f2:ce:b5:4a:1b:75:ba:16:b5:e5:27:4d:
30:91:95:24:88:d6:19:2e:0a:72:14:ac:73:1f:84:05:25:91:
73:82:34:b2:7c:d2:ce:d8:63:bb:ed:e7:9e:1b:26:d1:f1:48:
17:72:4c:e6:8b:ed:dd:41:b2:33:47:bb:3c:e8:6b:25:d7:54:
74:49:3a:db:b1:4c:ef:9a:c2:75:91:23:92:88:6f:de:5f:0b:
a4:95:03:40:12:ce:0f:89:f4:64:57:b9:7a:59:3a:95:0b:ef:
36:04:a8:30:1f:90:b4:7f:36:a2:19:2b:88:2c:2d:cb:67:08:
58:0e:4e:63:d1:e6:2f:ec:ac:f0:9a:bf:00:ad:0c:5d:91:55:
6e:83:99:07:53:22:e0:1f:5c:56:da:79:74:4d:36:35:3c:e1:
44:22:2a:9d:de:ab:a1:a7:12:3f:15:ae:2f:5a:47:dd:8b:d9:
6f:96:1b:7f:70:b0:65:44:69:02:29:05:d7:32:26:a3:23:f3:
93:00:53:10:f7:45:b1:68:6a:6e:4d:12:ec:12:b3:b9:aa:54:
36:44:29:be
-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIJALMeloVF0IH2MA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNV
BAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEQMA4GA1UECgwHUHJpdmF0ZTENMAsGA1UE
CwwEVGVhbTEWMBQGA1UEAwwNVG9wIFRyZWUgTmFtZTEhMB8GCSqGSIb3DQEJARYS
YWRtaW5AaXRjLWpwLnRva3lvMB4XDTE3MDgzMTEzMjYwM1oXDTIyMDgzMDEzMjYw
M1owgYsxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzESMBAGA1UEBwwJTWlu
YXRvLWt1MRAwDgYDVQQKDAdQcml2YXRlMQ0wCwYDVQQLDARUZWFtMRUwEwYDVQQD
DAx3d3cuaG9nZS5jb20xIDAeBgkqhkiG9w0BCQEWEWFkbWluQGRvbWFpbi1uYW1l
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2PXh5UA2ug0po4JIfN80
EPYN+hZ5yZnzb+6AQjy4fKnXM3B+twN8wCU+jBACwwXFw6Nr7KXxT87xl2dSp4OL
b8l/BMXNAMBThd9vvMNcRmIMXdCJcZt6Ljfx1t5SPAe9zyGaHZUkJyIMSjOXSRTP
2qRrUJQ59O77icm+Zpuk2mTpoiHj+GF1HFcB7FvP2uR4z9sWmz44AVbi3eHAeVoZ
l7ZSJTtjDJ9rd37+KqkOnUnn9pG2Q7LnDZf6omgqM+3KEAgJE3cZl9eEVbzVwiNr
lrKacVhxTrTgPcDTzvxyRkTnXUScf2UWn13hAjUC9Ua2JTWBYeB73Q7yOX8v907z
wQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdl
bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUhpSyH2xfsusCe0CJd4AS0wL3
5X8wHwYDVR0jBBgwFoAU3ldTkKt8Bp2M/T2fdHYVFSm5CTQwDQYJKoZIhvcNAQEL
BQADggEBAJw3qtpbfpu9a/CDO1QKZWYl2oXILyjLM1opQ6jfTdj7aXHX7xXupJ3n
VvLOtUobdboWteUnTTCRlSSI1hkuCnIUrHMfhAUlkXOCNLJ80s7YY7vt554bJtHx
SBdyTOaL7d1BsjNHuzzoayXXVHRJOtuxTO+awnWRI5KIb95fC6SVA0ASzg+J9GRX
uXpZOpUL7zYEqDAfkLR/NqIZK4gsLctnCFgOTmPR5i/srPCavwCtDF2RVW6DmQdT
IuAfXFbaeXRNNjU84UQiKp3eq6GnEj8Vri9aR92L2W+WG39wsGVEaQIpBdcyJqMj
85MAUxD3RbFoam5NEuwSs7mqVDZEKb4=
-----END CERTIFICATE-----
Signed certificate is in newcert.pem
サーバ秘密鍵のパスフレーズを削除

Apacheの起動時にいちいちパスフレーズを入力する必要が無くなります。
アプライアンスではパスフレーズを削除しなくてもパスフレーズ入力項目があるものと予め削除が必要なものとがあるよあです。

# openssl rsa -in newkey.pem -out newkey-nopass.pem
Enter pass phrase for newkey.pem:YYYYYYYY
writing RSA key
独自CA局でより汎用的に署名する

デフォルト設定だと、国名・地域・会社名が署名してもらいたい証明書と同一が必須ポリシーになっています。
このポリシーを変更するにはopenssl.conf を以下のように修正します。

# For the CA policy
[ policy_match ]
countryName = supplied
stateOrProvinceName = supplied
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

SSL 証明書の確認

以下のフォームに入力の上「送信する」ボタンを押して下さい。

証明書
タイプ

CERの内容を確認 CSRの内容を確認 秘密鍵の内容を確認 CRLの内容を確認

説明

CER:サーバ証明書 CSR:証明書署名要求 CRL:証明書失効リスト


サーバに設定されている証明書を確認する

opensslコマンドを利用して証明書の確認が可能です。

コマンド例
openssl s_client -connect ssl.hogehoge.com:443 -showcerts
TCPポート番号例
HTTPS     443
POP over SSL  995
SMTP over SSL 465
IMAPS     993
出力結果の例
[-----BEGIN CERTIFICATE-----] から[-----END CERTIFICATE-----] までが証明書です。
頭に「s」がついているのがその証明書の情報、「i」がついているのがその証明書の発行者の情報です。
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.ishige-jp.com
verify return:1
---
Certificate chain
0 s:/CN=www.ishige-jp.com
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
MIIFKzCCBBOgAwIBAgISA+qdMNYNV3p2LL+kPTQ+mLZ6MA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNzAzMDMxMDEyMDBaFw0x
NzA2MDExMDEyMDBaMBwxGjAYBgNVBAMTEXd3dy5pc2hpZ2UtanAuY29tMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3f3q0ZLwRwBXDnDJA80//lIkOV3R
.
.
.
oHSbrT7km1iUlCGTgfvL7BaPe1UKd0PrXZQI530Pfw==
-----END CERTIFICATE-----
1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
.
.
.
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=www.ishige-jp.com
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 3195 bytes and written 373 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
  Protocol : TLSv1.2
  Cipher  : ECDHE-RSA-AES256-GCM-SHA384
.
.
.

証明書ファイルの内容を確認する

証明書ファイルの内容を確認
# openssl x509 -text -noout -in /[FilePath]/[CertFile]
秘密鍵ファイルの内容を確認
# openssl rsa -text -noout -in /[FilePath]/[KeyFile]
CSRファイルの内容を確認
# openssl req -text -noout -in /[FilePath]/[CSRFile]

↑先頭