Grow up

生活とプログラミング

Ubuntu 18.04 自己署名証明書でSSLに対応する

はじめに

SSLに対応したテスト環境が必要になったので自己署名証明書を利用しました。
今回は証明書を発行して Google ChromeSSLに対応する方法をまとめます。
内容は 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 をダブルクリックして起動して、[証明書のインストール]ボタンを左クリック。
f:id:knkomko:20210503011911p:plain:w350

"ローカルコンピュータ"を選択して[次へ]ボタンを左クリック。
f:id:knkomko:20210503012150p:plain:w350

"証明書をすべて次のストアに配置する"を選択して[参照]ボタンを左クリック。
f:id:knkomko:20210503012259p:plain:w350

"信頼されたルート証明機関"を選択して[OK]ボタンを左クリック。
f:id:knkomko:20210503012346p:plain:w250

[次へ]ボタンを左クリック。
f:id:knkomko:20210503012444p:plain:w350

[完了]ボタンを左クリック。
f:id:knkomko:20210503012518p:plain:w350

メッセージが表示されたらインストールは完了です。
f:id:knkomko:20210503012538p:plain:w250

自己署名証明書の作成
$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
hostファイルの編集

DNSサーバの代わりにhostファイルを使用して名前解決をしました。
Windows10 の場合は C:\Windows\System32\drivers\etc にあります。
f:id:knkomko:20210503013032p:plain:w450

サーバのIPとサーバ証明書に入力していたドメイン名を入力します。

<サーバのIP>          example.com

f:id:knkomko:20210503013225p:plain:w450

SSLの確認

SSLに対応している事が確認できました。
f:id:knkomko:20210503013720p:plain:w450