">
FlatIsleロゴ

Flat Isle 日誌

OpenSSLで自己証明書を作成する

2022-07-08

最近のWebアプリケーションの開発で、SSL通信でなければエラーが発生することが増えています。
DebianでSSL通信のテストプログラムを作成中に、Chromeで「保護されていない通信」のエラーが発生しました。本エラーは過去Chrome58での変更で「Common Name」から「Subject Alt Name」を参照するように変更されたため発生します。
2022年1月現時点でのDebianでの自己証明書の作成方法、パソコン、スマートフォンの証明書の登録方法を、整理していきます。

自己証明書の作成

自己証明書の作成

DebianでOpenSSLコマンドを使って自己証明書を作成するには以下のコマンドを実行します
本コマンドで作成された証明書は、自己署名した自己証明書となります
(別ファイルを使わず、1コマンドで作れるように工夫しました(意地))

sudo openssl req -new \
	-x509 -out server.crt \
	-newkey rsa:2048 -keyout server.key \
	-days 3650 -sha256 \
	-subj "/C=JP/CN=webserver" \
	-addext "subjectAltName = DNS:webserver, IP:192.168.1.100" \
	-nodes
コマンド名
オプション名
設定値解説
openssl req証明書要求(csr)や証明書(crt)を作成するコマンド
-new証明書要求の新規作成
-x509証明書作成モード
これを指定しないと証明書要求の作成モードになる
-outファイル名出力する証明書ファイル名を指定
-newkeyrsa:2048鍵の新規作成
RSA(暗号アルゴリズム)のビットサイズを指定
-keyoutファイル名出力する鍵ファイル名を指定
-days3650証明書の有効日数を指定(例では約10年)
-sha256ハッシュ関数暗号化に使うハッシュ関数を指定
SHA3-256等も使える
ちなみにオプション名は-digest
-subj“/C=JP/CN=…”C:国名を2文字で記述
CN(Common Name):サーバ名やドメイン名を指定
上記の2つは必須。他に指定できる項目は下記の通り
ST:州や県名
L:町名など
O:組織や会社名
OU:部署名など
emailAddress:メールアドレス
-addext“subjectAltName=…”X.509拡張パラメータの設定
DNS:サーバ名(例:webserver)やドメイン名を指定
IP:サーバのIPアドレスを指定
-nodes鍵ファイルを暗号化しない(パスフレーズの設定・削除が不要)
OpenSSL3.0以降では -noenc に変更されているので注意

自己証明書の確認

以下のコマンドで作成した証明書の内容が確認できます

openssl x509 -text -noout -in server.crt

以下は証明書の内容の一例です

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, CN = webserver
        Validity
            Not Before: Jan 24 08:33:58 2022 GMT
            Not After : Jan 22 08:33:58 2032 GMT
        Subject: C = JP, CN = webserver
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:a0:b0:00:00:00:00:00:00:00:00:00:00:00:00:
                    (長いので中略)
                    00:00
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                AA:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
            X509v3 Authority Key Identifier: 
                keyid:AA:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Subject Alternative Name: 
                DNS:webserver, IP Address:192.168.1.100
    Signature Algorithm: sha256WithRSAEncryption
         e0:f0:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:
         (長いので中略)
         00:00:00:00
項目名解説
Versionバージョン3でないとX.509v3拡張機能が使えない
Serial Number認証局が割り当てたシリアル番号
Signature Algorithm署名に使われた暗号アルゴリズム
Issuer発行者(認証局)
Validity有効期限
Subject主体者(証明の対象となるサーバ)
Subject Public Key Info公開鍵の情報
X509v3 extensionsX.509v3拡張機能
ここで重要なのは X509v3 Subject Alternative Name に主体者のサーバ名やIPアドレスが入っている事
Signature Algorithm署名の暗号アルゴリズムと発行者の署名

自己証明書の登録

作成した証明書は認証局が自分自身のため、どこからも認証されておらずブラウザ上でエラーが発生します
以下の手順にてルート証明機関の証明書として登録し、SSL通信を有効にします

パソコン(Chrome)への登録

パソコンでChromeブラウザを開き、画面右上の3点ボタンをクリック
「設定」→画面左「セキュリティとプライバシー」→「セキュリティ」をクリック

下の方にスクロールすると「証明書の管理」があるのでクリック

証明書の管理画面が表示されたら「信頼されたルート証明機関」をクリックしてから「インポート」をクリック

インポートウィザード画面が開いたら「次へ」をクリック

「参照」をクリックし、作成した証明書ファイル(crt)を選択して「次へ」をクリック

証明書ストアは「信頼されたルート証明機関」のままで「次へ」をクリック

「完了」をクリックしてインポートを実行

自己署名証明書なのでセキュリティ警告が表示されますが、「はい」をクリック

「正しくインポートされました」と表示されたら「OK」をクリック
設定画面を閉じ、ブラウザのアドレスバーに「https://証明書を登録したサーバ名かIPアドレス」を入力して、ページが表示されれば作業完了です

パソコン(Edge)への登録

パソコンでEdgeブラウザを開き、画面右上の3点ボタンをクリック
「設定」→画面左「プライバシー、検索、サービス」をクリック

下の方にスクロールすると、セキュリティ設定内に「証明書の管理」があるのでクリック

証明書の管理画面が表示されます
以降の操作はChromeと全く同じ手順ですので、上記を参照ください

スマートフォン(Android)への登録

スマートフォンに登録する場合、予めSDカードまたはGoogleドライブに証明書(server.crt)を保存しておきます
スマートフォンの「設定」→「セキュリティ」→詳細設定の中「暗号化と認証情報」より、
「ストレージからインストール」または「SDカードからインストール」(Androidのバージョンによって異なります)を選びます
「SDカードからインストール」しか表示されていない場合でも、参照先として「Googleドライブ」が選択可能です

証明書ファイル(crt)を選択すると、本人確認(指紋認証等)後、「証明書の名前を指定する」画面が表示されます
「証明書名」にサーバ名(上記例では「webserver」)を入力して「OK」をタップ

登録した証明書は「信頼できる認証情報」→「ユーザー」タブ内で確認できます

なお、iOSへの証明書設定方法は下記の参考ページ等をご覧ください
(iOSの機器は未所持なので確認できませんでした)