
前回の「【ConoHa VPSでアルファSSL 其の一】〜SSL/TLSの基礎知識編~」では、SSL/TLSの基本やアルファSSLの特徴、そしてConoHa VPSの利用方法について解説しました。
今回は、実際にサーバー上でSSL化への第一歩となる「CSR(証明書署名要求)」を作成していく実践編です。
CSR(証明書署名要求)とは
CSR(Certificate Signing Request)は、認証局(今回はGMOグローバルサイン)に対して「SSL証明書」の発行を申請するためのいわば「申し込み書」です。
ConoHa VPSサーバー内で生成した「秘密鍵」とペアになる「公開鍵」、および申請者の組織情報(ドメイン名や国、地域など)が含まれています。
このCSRを認証局に提出し、審査に合格することで初めてSSL証明書が発行されます。
SSL証明書(SSLサーバー証明書)は、Webサイトの通信を暗号化(https化)し、サイト運営者の実在性を証明する電子的な身分証明書です。ブラウザとサーバー間のデータを暗号化して盗聴や改ざんを防ぎ、信頼できるサイトであることを証明することで、フィッシング詐欺や「なりすまし」のリスクを軽減します。
作業環境の準備
まずはサーバー(ConoHa VPS)にSSH接続し、秘密鍵やCSRを安全に保存するための作業ディレクトリを準備します。
sudo mkdir -p /etc/ssl/private- ただし、
/etc/ssl/privateはDebian/Ubuntu系では標準で存在します。
「秘密鍵」は、CSRを生成するために必要です。そのため絶対に外部へ漏洩させてはならないファイルです。
ファイルを保存する「フォルダ(ディレクトリ)」の段階から、厳格なアクセス制限(パーミッション設定)をかける必要があります。
sudo chmod 700 /etc/ssl/privateLinuxにおけるchmod 700は、「所有者(今回はroot管理者)だけが読み書き・実行できる設定を意味します。この設定をしておくことで、万が一サーバー内に悪意のあるプログラムや他のユーザーが侵入しても、このフォルダ内のファイルは守られます。
openssl versionCSRの作成には openssl コマンドを使用します。openssl コマンドは通常Linuxに標準インストールされていますが、念のため以下のコマンドを実行し、バージョン情報が表示されることを確認しておきます。
秘密鍵(Private Key)とCSRの作成
SSL化の要となる「秘密鍵」と、認証局への申請書である「CSR」を作成します。
今回はパスフレーズ無し、RSA 3072bitで作成します。
sudo openssl genrsa -out /etc/ssl/private/example.com.key 3072genrsa コマンドは、デフォルトで「パスフレーズなし(暗号化なし)」で秘密鍵が作成されます。
しかし、もしセキュリティ要件などであえてパスフレーズをつけたい場合は、コマンド内に -aes256 などの暗号化オプションを追加します。
# パスフレーズ付きで秘密鍵を生成する場合
sudo openssl genrsa -aes256 -out /etc/ssl/private/example.com.key 3072※実行すると、ターミナル上でパスフレーズの設定(2回)を求められます。
Webサーバー運用においてパスフレーズ付きの秘密鍵を使用すると、サーバーやNginxを再起動するたびにパスフレーズの入力を求められ、手動入力が完了するまでWebサーバーが起動できない状態になります。そのため、特別な理由がない限りはパスフレーズなしにするのが一般的です。
末尾の数字は鍵の長さを表します。一般的には「2048」が多く使われていますが、前回の「【ConoHa VPSでアルファSSL 其の一】〜SSL/TLSの基礎知識編~」でも触れた「2030年問題(2048bitの安全性低下)」を見据え、本記事ではよりセキュアで長期的に安全な「3072bit」を採用しています。

尚、より高速な「ECDSA(楕円曲線暗号)」を使いたい場合は、genrsa の代わりに genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 を使用します。
作成した秘密鍵を読み込み、CSR(申請書)を生成します。作成方法には「対話形式」と「一括指定形式」の2つがあります。
ここでは「対話形式」で説明します。
コマンドを実行すると、ターミナル上で「国名は?」「組織名は?」と順番に聞かれるため、最初はこちらで実行することをおすすめします。
sudo openssl req -new -key /etc/ssl/private/example.com.key -out /tmp/example.com.csrその後順番に以下のように順番に入力します。
Country Name (2 letter code) [XX]: JP (国名:JPと入力)
State or Province Name (full name) []: Tokyo (都道府県を入力)
Locality Name (eg, city) [Default City]: Chiyoda-ku (市区町村を入力・省略可)
Organization Name (eg, company) [Default Company Ltd]: YourCompany (組織名・サイト名を入力)
Organizational Unit Name (eg, section) []: Web (部門名を入力・省略可)
Common Name (eg, your name...) []: www.example.com (★最重要:アルファSSLのデュアルアクセス(※)を有効にするにはここをwww付きで申請する必要があります。)
Email Address []: (何も入力せずEnterでスキップ)
Please enter the following 'extra' attributes...
A challenge password []: (何も入力せずEnterでスキップ)
An optional company name []: (何も入力せずEnterでスキップ)
質問される内容をあらかじめ -subj オプションの中に書き込んでおき、コマンド1行で一気に作成する方法です。入力ミスが起きにくいためおすすめです。
sudo openssl req -new -key /etc/ssl/private/example.com.key -out /tmp/example.com.csr -subj "/C=JP/ST=Tokyo/L=Chiyoda-ku/O=YourCompany/CN=www.example.com"
アルファSSLの「デュアルアクセス機能(www.example.com と example.com の両方でSSLを有効にする機能)」を利用する場合、CN(コモンネーム)には必ず「www」を含めたホスト名を指定してください。
また、CSR生成時に -addext などでSAN(Subject Alternative Name)を明示的に指定すると、かえって認証エラーになるケースがあるため、上記のようにシンプルに記述するのが正解です。
念のため生成されたCSRファイルを確認します。(game.doc778.comの例)
sudo openssl req -in /tmp/game.doc778.com.csr -noout -textgame.doc778.comの例
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = JP, ST = Virtual, O = ofbita, CN = www.game.doc778.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (3072 bit)
Modulus:
00:b3:34:8b:51:20:50:c5:cb:a0:17:f3:3d:80:21:
e8:f9:c1:0f:7e:9d:7e:87:b1:04:bc:e2:82:1b:02:
(中略)
Exponent: 65537 (0x10001)
Attributes:
(none)
Requested Extensions:
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
37:60:92:eb:d6:d2:00:ab:fe:46:a8:ad:48:aa:84:3d:76:f4:
(中略)
パスフレーズを設定しない分、ファイル自体へのアクセス権限を厳格に制限します。所有者(root)以外は絶対に読み取れない 600 に設定します。
sudo chown root:root /etc/ssl/private/example.com.key
sudo chmod 600 /etc/ssl/private/example.com.key秘密鍵とCSRをまとめて生成する方法
上記では秘密鍵を生成してからCSRを生成しましたが、まとめて生成する方法もあります。
sudo openssl req -new -newkey rsa:3072 -nodes \
-keyout /etc/ssl/private/example.com.key \
-out /tmp/example.com.csr \
-subj "/C=JP/ST=Tokyo/O=YourCompany/CN=www.example.com"このコマンド(req -newkey)は、デフォルトで秘密鍵にパスフレーズをかけようとします。それを防ぎ「パスフレーズなし」にするために、必ず -nodesオプションを付ける必要があります。
-nodesはNo DES encryptionの略と言われていますが、DESに限らず、秘密鍵への暗号化(パスフレーズ)をかけないオプションとして使われています。
-subj に指定できる主要なパラメータを網羅しました。
| パラメータ | 英語名 | 意味 | 入力例・注意点 |
|---|---|---|---|
| C | Country | 国名 | 必須:日本の場合は必ず JP(2文字) |
| ST | State | 都道府県 | 必須:Tokyo、Osaka など |
| L | Locality | 市区町村 | 任意:Chiyoda-ku など |
| O | Organization | 組織名 | 必須:会社名。個人の場合は Personal やサイト名 |
| OU | Org Unit | 部門名 | 任意:Web や IT など(省略可) |
| CN | Common Name | コモンネーム | 最重要:SSL化するドメイン名 |
CSR内容の確認(Modulusのハッシュ値比較)
アルファSSLに申し込む前に、作成したファイルが正しく生成されているか、秘密鍵とCSRが確実に「ペア」になっているかを必ず検証します。
過去に作った古い秘密鍵やCSRがサーバーに残っていると、誤って違うペアで申請してしまう事故が起こりがちです。ペアを間違えたまま証明書を発行してしまうと、サーバー設定時にエラーとなり最初からやり直し(再発行)になってしまうため、事前のチェックが非常に重要です。
1.CSRファイルの内容(CN)確認
指定したドメイン名が正しく含まれているか確認します。
openssl req -in /tmp/example.com.csr -noout -subject出力結果に CN = www.example.com が含まれていれば成功です。
2.生成されたCSRと秘密鍵のペアリング確認
鍵の本体を構成する「Modulus(モジュラス)」という巨大な文字列を抽出し、それをハッシュ化(短い文字列に変換)して見比べます。
# 秘密鍵のModulusハッシュ値を出力
sudo openssl rsa -noout -modulus -in /etc/ssl/private/example.com.key | openssl sha256
# CSRのModulusハッシュ値を出力
sudo openssl req -noout -modulus -in /tmp/example.com.csr | openssl sha256この2つのコマンドの出力結果(英数字の文字列)が完全に一致していれば、間違いなく正しいペアです。安心して次の申請作業に進んでください。
まとめと次回予告
本記事では、OpenSSLコマンドを使った秘密鍵の生成から、アルファSSL特有の仕様(www付きでの申請とSANの罠)を考慮したCSRの作成、そして確実なペアリング確認までを行いました。作成した秘密鍵は絶対に外部に漏らさないようご注意ください。
次回「【ConoHa VPSでアルファSSL 其の三】~コントロールパネルでの申し込みとDNS認証手順~」では、今回作成したCSRファイルの中身を使って、実際にConoHaのコントロールパネルからアルファSSLの申し込みとDNS認証を行う手順を解説します。お楽しみに!

