2021年1月28日木曜日

Ubuntu でクライアント証明書を発行する方法

概要

過去 に 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 件のコメント:

コメントを投稿