よろずな情報屋

SSL証明書

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

シマンテック(旧ベリサイン)等の認証局から、署名付きの証明書を発行してもらう。
CSR(署名要求:Certificate Signing Request)を作成する。
オンライン申請システムにCSRを貼り付けて証明書を発行。
証明書をダウンロードする。
という流れになります。
これからのサーバ証明書手順
今までは上記手順でも良かったのですが、最近ではブラウザ側の扱いが変わってきて通信出来なくなったりします。
原因はRFC2818に
Common Name の利用が既存の実践ですが、これは不当であり、代わりに認証機関には、subjectAltName 拡張がある場合、それは、身元として使われなければなりません(MUST)
という内容が書かれている為と思われます。
なのでこれからは認証機関に申請するCSRにもCommon Nameだけではなく、subjectAltNameにDNS名としてホスト名を入れたもので申請する必要があるようです。
一般社団法人日本スマートフォンセキュリティ協会(JSSEC)様より
「Androidアプリのセキュア設計・セキュアコーディングガイド」
というのが公開されており、この手順に従って作成すると良いようです。
■ newca.sh   CA証明書を発行するためのスクリプト
■ openssl.cnf  スクリプト実行時に読み込まれる設定ファイル
■ newsv.sh   サーバ証明書を発行するためのスクリプト
スクリプト内や設定ファイルの設定値を自分の環境に合わせればとっても簡単にできちゃいます。

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

Let’s Encrypt 正式版としてリリースされました。
自動で証明書の更新ができ、Web サーバーを停止することなく証明書を取得できるようになったようです。
 → certbotのコマンドがhttpdの停止・開始をしていました。
# yum -y --enablerepo=epel install python-certbot-apache
# certbot certonly --standalone -d [FQDN] -d [FQDN] ※同一ドメインを複数指定可能です。
証明書や秘密鍵は「/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

※<ドメイン名>は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

以上で完了です。

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

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

CA局手順
1.OpenSSL の設定をCA局用に変更
2.CA局用秘密鍵と証明書要求(CSR)作成
3.自分で自分を署名
4.秘密鍵のパスフレーズを削除
5.CA局の証明書(ルート証明書)をWEBブラウザにインストールできる様にします
サーバ証明書手順
1.OpenSSL の設定をサーバ用に変更
2.サーバ秘密鍵とサーバ証明書要求(CSR)作成
3.CA局で署名
4.秘密鍵のパスフレーズを削除
5.サーバ秘密鍵とサーバ証明書をApacheのssl.confに指定
独自CA局でより汎用的に署名する

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

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

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

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]