2017.04

Debian プライベート認証局によるサーバー証明書発行 [MailServerⅣ]

OpenSSLで電子証明書を作成

### First,please visit -----------
Introduction & INDEX コチラから
------------------------------ ###

オフィスにLAN専用のメールサーバーを立てます。
今回は、SMTP,IMAPoverSSL/TLSを動かすためのサーバー証明書を作成します。
Opensslを使用した、プライベート認証局による自己署名入り証明書です。

なお、SSL暗号化通信の公開鍵(PublicKey),秘密鍵(PrivateKey)の仕組みについて、本章では解説していません。
他の方のWeb情報などお調べください。

■ INDEX
Postfixで送信[SMTP]サーバー : MailServer-Ⅰ
Dovecotで受信[IMAP]サーバー : MailServer-Ⅱ
Mailユーザー作成登録とクライアント側のメーラー設定: MailServer-Ⅲ
プライベート認証局によるサーバー証明書発行: MailServer-Ⅳ
SMTP/IMAP OverSSL/TLSで暗号化通信: MailServer-Ⅴ
ClamSMTP Mailをリアルタイムウィルススキャン: MailServer-Ⅵ
S/MIMEでセキュアなメール環境: MailServer-Ⅶ

< 環境 >
MAIL_LAN

■ 設定手順
   1.OpenSSL準備
   2.プライベート認証局のCA証明書を発行
   3.サーバー証明書を発行

[ 1 ] 準備

○ Opensslインストール
$ aptitude show openssl
# apt-get install openssl
$ openssl version
---脆弱性のあるヴァージョンは使用しない

○ 設定スプリクトの基本項目を編集
OpenSSLでは、証明書構築のためのスプリクトが用意されているのでそれを利用する。
File: /usr/lib/ssl/misc/CA.sh
$ sudo vi /usr/lib/ssl/misc/CA.sh

## 63行目辺り: CADAYS有効期限を自由に設定するため
## コメントアウト"#"する
if [ -z "$DAYS" ] ; then DAYS="-days 365" fi # 1 year
#CADAYS="-days 1095" # 3 years

File: /usr/lib/ssl/openssl.cnf

$ ls -l /usr/lib/ssl/openssl.cnf
lrwxrwxewx 1 root root 10 Jan 10 10:10 /usr/lib/ssl/openssl.cnf -> /etc/ssl/openssl.cnf
"openssl.cnf"実体ファイルを、認証局(CA)用.サーバー用とそれぞれ名前をつけて複製する。
$ sudo cp /usr/lib/ssl/openssl.cnf /etc/ssl/openssl_ca.cnf
$ sudo cp /usr/lib/ssl/openssl.cnf /etc/ssl/openssl_server.cnf

[ 2 ] プライベート認証局のCA証明書を発行

認証局 (CA: Certification Authority)で発行する証明書いわゆる
CA証明証は通常、サーバー1基で1回だけ作成し、
これを元にしてサーバー/クライアント証明書を発行する。
プライベート認証局は、
当然にして正式な認証局ではないので対外的には通用しない。
○ File:openssl_ca.cnf[編集]
$ sudo vi /etc/ssl/openssl_ca.cnf

## 40行目辺り ## 行番号表示 ダブルコロン":" + set number
[ CA_default ]

#dir  = ./demoCA   # Where everythung is kept
dir   = ./CA       # Where everythung is kept

## 164行目辺り
[ usr_cert ]

# these extensions are added when 'ca' signs a request.
# this goes against PKIX guidelines but smone CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.

#basicConstraints=CA:FALSE
basicConstraints=CA:TRUE

## 226行目辺り〜(中略)〜250行目辺り
[ v3_ca ]
## 〜(中略)〜
## コメントアウト"#"外す
# nsCertType = sslCA, emailCA
nsCertType = sslCA, emailCA

## 330行目辺り
[ tsa_config1 ]

# these are used by the TSA reply generation only.
#dir  = ./demoCA   # TAS root directory
dir   = ./CA       # TAS root directory

○ CA証明書発行
$ cd /etc/ssl
$ sudo CADAYS="-days 3650" SSLEAY_CONFIG="-config /etc/ssl/openssl_ca.cnf" \
CATOP=./CA /usr/lib/ssl/misc/CA.sh -newca

CA certificate filename (or enter to create):(空欄で可)↵

Making CA certificate ...
Generating a 2048 bit RSA private key
....................+++
...........................+++
writing new private key to './CA/private/./cakey.pem'
Enter PEM pass phrase:*******(任意のパスワード: 画面上は表示されない)↵
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 DN.
There are quite afew fileds 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) [AU]:JP(任意)↵
State or Province Name (fukk name) [Some_State]:Miyagi(任意)↵
Locality Name (eg, city) []:Sendai(任意)↵
Organization Name (eg, company) [Internet Widgits Pty Ltd]: (任意)↵
Organizational Unit Name (eg, section) []: (任意)↵
Common Name (e.g. server FQDN or YOUR name) []:PrivateCA(任意)↵
Email Address []:priv_ca@green-pen.jp(任意)↵

Please enter the following 'extra' attributes
to be sent whit your certificate request
A challenge password[]:(空欄で可)↵
An optional company name[]: (任意)↵
Using configuration from /etc/ssl/openssl.ca.cnf
Enter pass phrase for ./CA/private/./cakey.pem:*******(上記のパスワード)↵
Check that the request matches the signature
Signature ok
Certificate Details:
 Serial Number:
    c9:62:5c:xx:xx:xx:xx:xx
 Validity
    Not Before: Apr 17 05 05:30:00 2017 GMT
    Not After : Apr 16 05 05:30:00 2027 GMT
 Subject:
    countryName = JP
    stateOrProvinceName = Miyagi
    organizationMane = Green-pen
    commonName = PrivateCA
    emailAddess = priv_ca@green-pen.jp
  X509v3 extensions:
    X509v3 Subject Key Identifier:
      CD:E2:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
    X509v3 Authority Key Identifier:
      keyid:CD:E2:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

    X509v3 Basic Constraints:
      CA:TRUE
    Netscape Cert Type:
      SSL CA, S/MIME CA
Certificate is to be certified until Apr 16 05:30:00 2027 GMT (3650 days)

Write out datadase with 1 new enteries
Date Base Updated

$ ls -l /etc/ssl/CA/*
-rw-r--r-- 1 root root /etc/ssl/CA/cacert.pem ---> CA証明書: cakey.pemで署名済みPublicKey
-rw-r--r-- 1 root root /etc/ssl/CA/careq.pem ---> 署名前PublicKey
/etc/ssl/CA/private:
-rw-r--r-- 1 root root cakey.pem ---> CA PrivateKey

○ PEM形式のCA証明書を作成する
上記で発行したCA証明書をOpenSSLコマンドでPEM形式に変換する
& sudo openssl x509 -in /etc/ssl/CA/cacert.pem -outform PEM -out /etc/ssl/CA/capem.pem
$ ls -l /etc/ssl/CA/
-rw-r--r-- 1 root root /etc/ssl/CA/cacert.pem
-rw-r--r-- 1 root root /etc/ssl/CA/capem.pem ---> PEM形式CA証明書
-rw-r--r-- 1 root root /etc/ssl/CA/careq.pem

[ 3 ] サーバー証明書を発行

○ File:openssl_server.cnf[編集]
$ sudo vi /etc/ssl/openssl_server.cnf

## 40行目辺り
[ CA_default ]
#dir  = ./demoCA   # Where everythung is kept
dir   = ./CA       # Where everythung is kept

## 74行目辺り デフォルトの有効証明期間を10年に変更
#default_days = 365
default_days = 3650

## 166行目辺り〜(中略)〜179行目当たり
[ usr_cert ]
## ここはFALSEのまま
basicConstraints=CA:FALSE
# This is OK for an SSL server.
## コメントアウト"#"外す
#nsCertType    = server
nsCertType    = server

## 330行目辺り
[ tsa_config1 ]
# these are used by the TSA reply generation only.
#dir  = ./demoCA   # TAS root directory
dir   = ./CA       # TAS root directory

○ サーバー証明書(署名前)を作成
$ cd /etc/ssl
$ sudo DAYS="-days 3650" SSLEAY_CONFIG="-config /etc/ssl/openssl_server.cnf" \
CATOP=./CA /usr/lib/ssl/misc/CA.sh -newreq

Generating a 2048 bit RSA private key
.....................+++
...............+++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:XXXXXXX(任意のパスワード)↵
Verifying - Enter PEM pass phrase:XXXXXXX(もう一度)↵
-----
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) [AU]:JP(任意)↵
State or Province Name (full name) [Some_State]:Miyagi(任意)↵
Locality Name (eg, city) []:Sendai(任意)↵
Organization Name (eg, company) [Internet Widgits Pty Ltd]:green-pen(任意)↵
Organizational Unit Name (eg, section) []:postman(任意)↵
Common Name (e.g. server FQDN or YOUR name) []:miyagi.lan.mail↵
Email Address []:info@lan.mail(任意)↵

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

これでサーバー証明書(認証局の署名前)が発行された。
$ ls -l
-rw-r--r-- 1 root root newkey.pem ---> サーバー用PrivateKey
-rw-r--r-- 1 root root newreq.pem ---> サーバー証明書(CA署名前)PublicKey

○ プライベート認証局でサーバー証明書に署名を入れる
$ cd /etc/ssl
$ sudo SSLEAY_CONFIG="-config /etc/ssl/openssl_server.cnf" \
CATOP=./CA /usr/lib/ssl/misc/CA.sh -sign

Using configuration from /etc/ssl/openssl-server.cnf
Enter pass phrase for ./CA/private/cakey.pem:*******(CA証明書発行時のパスワード)↵
Check that the request matches the signature
Signature ok
Certificate Details:
  Serial Number:
    aa:XX:Xx:xx:XX:xx:XX:f4
  Validity
    Not Before: Apr 17 05:15:00 2017 GMT
    Not After : Apr 16 05:15:00 2027 GMT
  Subject:
    countryName = JP
    stateOrProvinceName = Miyagi
    organizationName = green-pen
    commonName = miyagi.lan.mail
    emailAddress = info@lan.mail
  X509v3 extensions:
  X509v3 Basic Constraints:
    CA:FALSE
  Netscape Cert Type:
    SSL Server
  Netscape Comment:
    OpenSSL Generated Certificate
  X509v3 Subject Key Identifier:
    49:Ex:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:0B
  X509v3 Authority Key Identifier:
    keyid:9C:6A:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx:XX:xx::3D

Certificate is to be certified until Apr 16 05:15:00 2027 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:
Data:
Version: 3 (0x2)
Serial Number:
aa:XX:Xx:xx:XX:xx:XX:f4
Signature Algorithm: sha256WithRSAEncryption

## 〜中略〜

Signed certificate is in newcert.pem

これで、プライベート認証局の署名入りサーバー証明書が発行された。

$ ls -l
-rw-r--r-- 1 root root newcert.pem ---> サーバー証明書署名有り
-rw-r--r-- 1 root root newkey.pem
-rw-r--r-- 1 root root newreq.pem

○ サーバー証明書に名前をつけて専用ディレクトリに保管する
名前変更: newcert.pem ---> miyagi.lan.mail.crt
        : newreq.pem ---> newreq_miyagi.pem
DIR移動: /etc/ssl ---> /etc/ssl/CA/certs
*重要: 名前はサーバー証明書の作成時に指定した"common name"を付ける。
*認証局CA直下のディレクトリへ移動
$ sudo mv /etc/ssl/newcert.pem /etc/ssl/CA/certs/miyagi.lan.mail.crt
$ sudo mv /etc/ssl/newreq.pem /etc/ssl/CA/certs/newreq_miyagi.pem
$ ls -l /etc/ssl/CA/certs
-rw-r--r-- 1 root root miyagi.lan.mail.crt
-rw-r--r-- 1 root root newreq_miyagi.pem

○ PEM形式のサーバー証明書を作成する
上記で発行したサーバー証明書をOpenSSLコマンドでPEM形式に変換する
& sudo openssl x509 -in /etc/ssl/CA/certs/miyagi.lan.mail.crt -outform PEM \
-out /etc/ssl/CA/certs/miyagi.lan.mail.pem
$ ls -l /etc/ssl/CA/certs/
-rw-r--r-- 1 root root miyagi.lan.mail.crt
-rw-r--r-- 1 root root miyagi.lan.mail.pem
-rw-r--r-- 1 root root newreq_miyagi.pem

○ サーバー用PrivateKeyにパスフレーズを埋め込む
名前変更: newkey.pem ---> newkey_miyagi.pem ---> miyagi.lan.mail.key
DIR移動: /etc/ssl ---> /etc/ssl/CA/private
$ sudo mv /etc/ssl/newkey.pem /etc/ssl/CA/private/newkey_miyagi.pem

$ sudo openssl rsa -in /etc/ssl/CA/private/newkey_miyagi.pem \
-out /etc/ssl/CA/private/miyagi.lan.mail.key
Enter pass phrase for /etc/ssl/CA/private/newkey_miyagi.pem:XXXXXXX↵
  (サーバー証明書発行時のパスワードを入力)

writing RSA key


$ ls -l /etc/ssl/CA/private/
-rw-r--r-- 1 root root miyagi.lan.mail.key
-rw-r--r-- 1 root root newkey_miyagi.pem

[ 4 ] まとめ

証明書発行は、結構ややこしいですね。
以下、階層をまとめてみました。
PrivateKeyは他者に流出しないように保管し、遺漏なきよう管理してください。
なお、本章で発行した次のファイルは次章Ⅴで使用します。
/etc/ssl/CA/certs/miyagi.lan.mail.pem
/etc/ssl/CA/private/miyagi.lan.mail.key

○ 階層
/etc/ssl/CA/cacert.pem CA証明書(cakey.pem署名入PublicKey)
capem.pemPEM形式のCA証明書(署名入)
careq.pemCAcsr署名前PublicKey
certs/miyagi.lan.mail.crtサーバ証明書(CA署名入PublicKey)
miyagi.lan.mail.pemサーバ証明書PEM形式(CA署名入PublicKey)
newreq_miyagi.pemサーバ証明書署名前
client/クライアント証明書用DIR
crl/証明書失効リスト用DIR
index.txtインデックス(通番号.識別名)の記録
newcerts/CA証明書(通番号付名称)保管DIR
private/cakey.pemCAのPrivateKey
miyagi.lan.mail.keyサーバーPrivateKey(PassPhrase埋込)
newkey_miyagi.pemサーバー埋込前PrivateKey
serialシリアル通番号記録
Copyright(C) green-pen miyagi