概要
過去 に Mac で作成しました
今回は Ubuntu で作成してみたいと思います
環境
- Ubuntu 18.04
- openssl 1.1.1i
CA 用ディレクトリの作成
ここに鍵やクライアント証明書を作成していきます
sudo mkdir /CertificateAuthCA
ルートCAの作成
鍵を作成し鍵から証明書を作成します
CSR の情報は適当に入力します
今回の方法では鍵にパスフレーズの設定が必要になるので入力しましょう
sudo openssl genrsa -des3 -out ca.key 4096
sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
クライアント証明書の作成
こちらもまずは鍵を作成します
次に CSR を先に作成してその CSR と先ほど作成してルートCA の鍵と証明書を使ってクライアント証明書を作成します
sudo openssl genrsa -des3 -out client.key 2048
sudo openssl req -new -key client.key -out client.csr
sudo openssl x509 -req -days 365 -in client.csr -CA myca.crt -CAkey myca.key -set_serial 01 -out client.crt
nginx で動作確認するので pem ファイルも作成しておきます
sudo openssl x509 -in client.crt -outform PEM -out client.pem
Optional: サーバ証明書の作成
nginx で動作確認します
クライアント証明書は https が必須なので https で nginx が動作するためにサーバ証明書も作成しておきます
sudo apt -y install nginx
sudo mkdir /etc/nginx/certificates
sudo chown -R www-data:www-data /etc/nginx/certificates
cd /etc/nginx/certificates
サーバ証明書配置ディレクトリを作成してそこに作成します
鍵、CSR、証明書を作成します
sudo openssl genrsa -out domain.com.key 2048
sudo openssl req -new -sha256 -key domain.com.key -out domain.com.csr
sudo openssl x509 -in domain.com.csr -out domain.com.crt -req -signkey domain.com.key -days 3650
あとは nginx の設定をします
cd /etc/nginx/sites-available
sudo touch proxy.conf
sudo vim proxy.conf
ssl_client_certificate /CertificateAuthCA/ca.pem;
ssl_verify_client on;
sudo ln -s /etc/nginx/sites-available/proxy.conf /etc/nginx/sites-enabled/proxy.conf
sudo systemctl restart nginx
systemctl status nginx
動作確認
curl で動作確認します
必要になるのはクライアント証明書と鍵になります
また curl の場合は --key
で指定する鍵情報に証明書の情報も含まれている必要があるので注意してください
cat client.crt client.key > client_curl_key.pem
curl -k --cert ./client.crt --key ./client_curl_key.pem https://localhost
ちなみに Ruby では以下のスクリプトで動作します
vim test.rb
require 'net/https'
https = Net::HTTP.new('localhost', 443)
https.use_ssl = true
https.cert = OpenSSL::X509::Certificate.new(File.read('./client.crt'))
https.key = OpenSSL::PKey::RSA.new(File.read('./client.key'), 'pass')
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
https.verify_depth = 5
https.start {
response = https.get('/')
puts response.body
}
ruby test.rb
最後に
中間CA がある場合にはまた作業や挙動が異なると思います
証明書はクライアントごとに発行できるます
もし複数のクライアントで証明書を作成した場合は nginx 側では ca.pem の後ろに結合していけば OK です
0 件のコメント:
コメントを投稿