今回もSSL関連の記事です。
現象は、オレオレ認証局の証明書がAndroid端末で正常にインポートされませんでした。
どうなるかというと、Androidの設定⇒セキュリティ⇒ストレージからインストールの順で選択していき、端末に移した認証局の証明書をインストールしようとしたら、「パッケージの内容」の箇所に「ユーザ証明書1件」と表示され
進んでみると、ユーザ認証情報のところに選択した認証局の証明書が入ってしまいます。
予定では、信頼できる認証情報のユーザの部分に表示されるはずでした。。
で、何が悪かったかというと
認証局の証明書を作成するコマンド「openssl」なんですが、そいつが参照する設定ファイル「/etc/pki/tls/openssl.cnf」に原因がありました。
注目する部分は「basicConstraints」です。ここが「CA:FALSE」となっていたのです。
なので、証明書を作成する際には、CA:TRUEの設定にしてやらないといけませんでした。
Chromeのバージョン58以降はCNではなく、SANをドメイン名としてチェックするため、SAN情報とともにCA:TRUEの設定も入れる必要があったので
1 2 3 4 5 6 7 |
[ SAN ] subjectAltName = @alt_names basicConstraints=CA:TRUE [ alt_names ] DNS.1 = ドメイン1 DNS.2 = ドメイン2 |
ってのをopenssl.cnfの最下部に追加しました。
証明書作成コマンドで、SANを使いますよと教えてあげればできあがります。
1 |
openssl x509 -req -days 3650 -sha256 -in root.csr -signkey root_private.key -extfile ./ca.cnf -extensions SAN -out root.crt |
-extensionsの部分ですね。ちなみに上のコマンドでは、openssl.cnfをカレントディレクトリに「ca.cnf」というファイル名でコピーしてきてます。
これで、Android端末に取りこんだときに「パッケージの内容」箇所が「CA証明書1件」となります!
ちゃんとCAとして認識してくれたみたいですな。
PINコードを入力し、先に進むと信頼できる認証情報のユーザータブに無事に表示されました!
ちなみに、作成した認証局の証明書を使ってサーバ証明書、クライアント証明書を発行するコマンドはこれ
1 |
openssl x509 -req -days 3650 -sha256 -in server.csr -CA root.crt -CAkey root_private.key -CAcreateserial -extfile ./ca.cnf -extensions SAN -out server.crt |
上記がサーバ証明書の発行コマンド
1 |
openssl pkcs12 -export -in server.crt -inkey server_private.key -out client.p12 -name Something -CAfile root.crt |
上記がクライアント証明書用にp12ファイルを作成するコマンド
※サーバ側、クライアント側どちらも同じ証明書を使ってますので分けたい人は別にクライアント側の秘密鍵、CSRを作ってください
おしまい!
コメント