少し前まで、SSL証明書は少々高価なものであり、個人のサイトでは正規のhttpsに対応したサイトははあまりありませんでした。
どうしてもSSL通信が必要な場合は自己証明書(オレオレ証明書)を作成してインストール…なんてこともよく行われていました。
最近になって、sslの重要性が見直され、Let’s Encryptのような無料で正規のSSL証明書を取得できるサービスも出てきたので、もっぱら最近ではわざわざ自己証明書を発行する機会は少なくなりました。
そんな中、先日久しぶりに自己証明書を発行する機会が。
社内でのWebサービスのテストに使用するために発行することになりました。
Let’s Encryptを搭載しても良かったのですが、更新が面倒という点と今回は社内での確認にのみ使用するのでそこまでやらなくていいだう、ということで、今回は自己証明書になりました。
久しぶりすぎて、手順がうろ覚えだったのでやり方を復習。
今回はこちらのサイトを参考にしました。
こちらの記事では認証局を作る、という前提で説明されていますが、今回は一つだけ証明書があれば問題ないので、ルート証明書をそのままSSL証明書として利用します。
自分の場合、今回はWindowsでサクッとやりたかったので、今回はWindows用パッケージマネージャーChocolateyを使用してopensslをインストールしました。
(chocolateyの入手についてはこちら)
chocolateyでopensslを導入するには、Windows上のシェルで次のコマンドを入力します。
choco install openssl.light
これだけでインストールできます。
あらかじめ管理者権限に昇格しておくことをお勧めします。
インストール完了したら、コマンド画面を一度開きなおします。
これでopensslが利用可能になりました。
次に、秘密鍵を生成します。
openssl genrsa -aes256 -out c:\path\to\dir\cakey.pem 2048
権限があれば好きな場所に作成できます。
色々聞かれますが、なるべく正しい情報を埋めてみてください。
特にコモンネーム(Common Name:cn)が実際にテストしたいドメイン名と異なっていると無効になってしまい、エラーがでます。
“c:\path\to\dir”は実際に秘密鍵を作成したいディレクトリに置き換えてください。
次に、csr(サーバ証明書要求)ファイルを作成します。
openssl req -new -key c:\path\to\dir\cakey.pem -out c:\path\to\dir\cacert.csr
csrとは簡単に言うと、認証局に対して、「こんな内容のSSL証明書が欲しい。正しいというサインくれ」というような要求を認証局に対してリクエストする仕組みです。
今回はこの認証局も自分になるので、このcsrファイルに対して署名してみましょう。
openssl x509 -days 3650 -in -out c:\path\to\dir\cacert.csr -req -signkey c:\path\to\dir\cakey.pem -out c:\path\to\dir\cacert.crt
生成されたcacert.crtをクリックすると、ウインドウが出てきますので、”証明のパス”をクリックします。
“信頼されたルート証明機関のストアに存在しないため…”というエラーが出てくるかと思います。
信頼されているルート証明とそうでないものの違いは何かというと、単にOSの”信用できる業者リスト”に登録されているかいないかの違いのみです。
従って、自分で作成したオレオレ証明書も、”信頼されたルート証明機関”に登録してしまえば、登録したPCでは本物のSSLと同様に利用することが可能です。
登録するには、先ほどのウインドウの”全般”タブをクリックすると
“証明書のインストール” というボタンが出てくるのでこれをクリック
自分しか使わないのであれば”現在のユーザー”のまま次へを押します。
“証明書をすべて次のストアに配置する”を選択し、”参照”をクリック
“信頼されたルート証明書”を選択してOKをクリックします。
再度証明書をクリックして開き、”証明書のパス”タブの証明書の状態が”この証明書は問題ありません”と表示されていれば作成は完了です。
あとはこの証明書と秘密鍵を検証環境に設定すればSSL通信を利用することができます。
現在では、テスト環境でもLet’s Encryptを使うのがベストですが、更新の手間が面倒な場合や、サーバーがインターネットからアクセスできない場合はオレオレ証明書を使う必要が出てきます。
どうやってSSL証明書ができているのかを理解するのにも役立ちますので、是非試してみてください。