Ubuntu 18.04 自己署名証明書でSSLに対応する
はじめに
SSLに対応したテスト環境が必要になったので自己署名証明書を利用しました。
今回は証明書を発行して Google Chrome でSSLに対応する方法をまとめます。
内容は example.com にアクセスして Nginx のトップページを表示します。
自己認証局の準備
証明書の保存場所を指定します。
$sudo vim /etc/ssl/openssl.cnf [ CA_default ] dir = /etc/ssl/example-ca # Where everything is kept
証明書の保存場所を作成します。
$mkdir /etc/ssl/example-ca $cd /etc/ssl/example-ca $ sudo mkdir certs $ sudo mkdir private $ sudo mkdir crl $ sudo mkdir newcerts $sudo sh -c "echo '01' > /etc/ssl/example-ca/serial" $sudo touch /etc/ssl/example-ca/index.txt
CA証明書の作成
$cd /etc/ssl/example-ca #有効期限が10年の自己署名証明書を作成 sudo openssl req -new -x509 -newkey rsa:2048 -out cacert.pem -keyout private/cakey.pem -days 36500 #認証局のパスワードを入力 Enter PEM pass phrase: #パスワードの再入力 Verifying - Enter PEM pass phrase: #証明書の情報を入力 Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Ota Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example CA Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:Example CA Email Address []:email@example.com
2つのファイルが作成されている事を確認します。
#CA証明書 /etc/ssl/example-ca/cacert.pem #CA証明書の秘密鍵 /etc/ssl/example-ca/private/cakey.pem
作成したCA証明書をブラウザにインポート
以下のコマンドで作成した example-ca.der をクライアント側で実行します。
$sudo openssl x509 -inform PEM -outform DER -in /etc/ssl/example-ca/cacert.pem -out /etc/ssl/example-ca/example-ca.der
Windows10 の場合になります。
exemple-ca.der をダブルクリックして起動して、[証明書のインストール]ボタンを左クリック。
"ローカルコンピュータ"を選択して[次へ]ボタンを左クリック。
"証明書をすべて次のストアに配置する"を選択して[参照]ボタンを左クリック。
"信頼されたルート証明機関"を選択して[OK]ボタンを左クリック。
[次へ]ボタンを左クリック。
[完了]ボタンを左クリック。
メッセージが表示されたらインストールは完了です。
自己署名証明書の作成
$sudo mkdir /etc/ssl/example.com/ $sudo openssl req -new -keyout /etc/ssl/example.com/example-key.pem -out /etc/ssl/example.com/example-csr.pem #秘密鍵のパスワードを入力 Enter PEM pass phrase: #パスワードの再入力 Verifying - Enter PEM pass phrase: #証明書の情報を入力 Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Ota Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example CA Organizational Unit Name (eg, section) []: #ドメイン名を入力 Common Name (e.g. server FQDN or YOUR name) []:example.com Email Address []:email@example.com #パスワードを入力 A challenge password []: An optional company name []:
2つのファイルが作成されている事を確認します。
#サーバ証明書要求ファイル /etc/ssl/example.com/example-csr.pem #サーバ秘密鍵 /etc/ssl/example.com/example-key.pem
SAN を含んだ自己署名証明書の作成
Google Chrome 58 から Common Name ではなく SubjectAltName でドメイン名を確認するため、SubjectAltName を含んだ自己署名証明書を作成します。
$cd /etc/ssl/example.com $sudo sh -c "echo subjectAltName=DNS:example.com > san.ext"
ファイルが作成されている事を確認します。
#SubjectAltName ファイル
/etc/ssl/example.com/san.ext
root権限を使用して署名を行います。
#rootにログインする $sudo su #自己承認局で署名 $openssl ca -days 36500 -cert /etc/ssl/example-ca/cacert.pem -keyfile /etc/ssl/example-ca/private/cakey.pem -in /etc/ssl/example.com/example-csr.pem > /etc/ssl/example.com/example.crt -extfile /etc/ssl/example.com/san.ext #自己認証局のパスワードを入力 Enter pass phrase for /etc/ssl/Hoge-Private-CA/private/cakey.pem: Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n] y #rootからログアウトする $exit
ファイルが作成されている事を確認します。
#SubjectAltName を含んだ自己署名証明書ファイル
/etc/ssl/example.com/example.crt
Nginx のインストール
$sudo apt update $sudo apt-get install -y wget $sudo apt-get install -y gnupg2 $wget https://nginx.org/keys/nginx_signing.key $sudo apt-key add nginx_signing.key $sudo vi /etc/apt/sources.list # sources.list に追加する deb http://nginx.org/packages/ubuntu/ bionic nginx deb-src http://nginx.org/packages/ubuntu/ bionic nginx $sudo apt update $sudo apt install nginx # Nginx のバージョンが表示される事を確認する $nginx -v
Nginx の設定
Nginxのサービス起動時に証明書のパスワード入力を求められるため
パスワードを入力したファイルを作成して参照するようにします。
$sudo vim /etc/ssl/example.com/pwf #パスワードを入力 example
証明書を利用してSSL通信ができるように設定します。
$sudo vim /etc/nginx/conf.d/default.conf #default.conf を変更 server { listen 80; listen 443 ssl; ssl on; server_name example.com; ssl_certificate /etc/ssl/example.com/example.crt; ssl_password_file /etc/ssl/example.com/pwf ssl_certificate_key /etc/ssl/example.com/example-key.pem
Nginx のサービスを開始します。
証明書のアクセス権が無いとエラーになるのでroot権限で実行しています。
#rootにログインする $sudo su #設定ファイルのテスト $nginx -t #サービスの開始 $systemctl start nginx #rootからログアウトする $exit