web-dev-qa-db-ja.com

Java keytoolで生成されたキーペアにAuthorityKeyIdentifierがありません

背景:(1)HTTPS接続用に構成されたWebアプリケーション、および(2)モバイルデバイスで実行されるPythonベースのクライアントアプリケーションで構成されるシステムのQA /テスト環境をセットアップしようとしています。 Webアプリケーションのインストーラーは、JKSファイルを要求します。このファイルには、サーバーが検証と暗号化のためにクライアントに提供するキーペアが含まれています。

免責事項:私はSSL証明書と関連する主題に関してはランクアマチュアであり、Learn-as-I-Goモードで作業しています。答えは素人のレベルまで下げておいてください。

問題:

私はJava keytoolと格闘していて、Webアプリケーションの目的で使用可能なJKSエントリを生成しようとしています。問題は、生成するエントリにAuthorityKeyIdentifier要素がないことです。 SubjectKeyIdentifier(もちろん)と使用 このドキュメント SubjectAlternativeNameと他の要素を追加する方法を見つけました...しかし、AuthorityKeyIdentifierを取得する方法を教えてくれるものは何もありません。

これに対する通常の手段は、CSRを生成し、それをCAによって署名することであると思いますが、これは厳密には内部QA環境であるため、自己署名を使用することを強くお勧めします。私が理解しているように、自己署名JKSエントリには、KeyIdentifierがSubjectKeyIdentifierのKeyIdentifierと重複するAuthorityKeyIdentifierを含めることができます。しかし、私が言ったように、私はJava keytoolを使用してそれを取得する方法に固執しています。

誰かがこれを取得する方法についてアドバイスまたは指示できますか?

1
JDM

keytoolの可能な拡張機能のリストは限られており、必要な権限キー識別子が含まれていないようです。

したがって、代わりにopensslを使用して自己署名証明書を作成します。証明書と秘密鍵をPKCS#12ファイルに変換します。最後に、必要に応じて、これをJKSに変換します。

まず、opensslの構成ファイルを作成し、現在のディレクトリにopenssl.confとして保存します。

[ req ]

# The size of the keys in bits:
default_bits       = 2048

# The message digest for self-signing the certificate
# sha1 or sha256 for best compatability, although most
# OpenSSL digest algorithm can be used.
# md4,md5,mdc2,rmd160,sha1,sha256
default_md = sha256

# Don't Prompt for the DN, use configured values instead
# This saves having to type in your DN each time.

Prompt             = no
string_mask        = default
distinguished_name = req_dn

# Extensions added while singing with the `openssl req -x509` command
x509_extensions = x509_ext

[ req_dn ]

countryName            = GB
stateOrProvinceName    = Somewhere
organizationName       = Example
commonName             = Example Web Service

[ x509_ext ]

subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always

subjectAltName = @alt_names

# No basicConstraints extension is equal to CA:False
# basicConstraints      = critical, CA:False

keyUsage = critical, digitalSignature, keyEncipherment

extendedKeyUsage = serverAuth

[alt_names]
DNS.1 = example.org
DNS.2 = www.example.org

次に、自己署名証明書と秘密鍵を作成します。

注:-nodesオプションを使用すると、パスフレーズなしで保護されていない秘密鍵を作成できます。PKCS#12では代わりに秘密鍵が使用されます。パスフレーズを使用するために秘密鍵が必要な場合は、このオプションを削除するだけです。

openssl req -x509 -new -nodes -days 720 -keyout selfsigned.key -out selfsigned.pem -config openssl.conf

これら2つを単一のPKCS#12に変換します。

注:-nameオプションはキーストアエイリアスである必要があります。

openssl pkcs12 -export -out selfsigned.p12 -in selfsigned.pem -inkey selfsigned.key -name MyApp

JavaはPKCS#12をキーストアとして使用できますが、JKSを主張する場合は、次のように変換してください。

keytool -importkeystore -srckeystore selfsigned.p12 -srcstoretype pkcs12 -destkeystore selfsigned.jks -deststoretype jks

keytoolは、JKSが独自の形式であることを警告し、PKCS#12を提案します。次に、PKCS#12パスフレーズを要求する前に、最初にnew JKSパスフレーズを要求します(2回)。

エクスポートすることで、証明書に必要なものがすべて含まれていることを確認できます。

keytool -exportcert -keystore selfsigned.jks -alias SelfSigned -file selfsigned.crt

最後に、それを確認してください:

keytool -printcert -file selfsigned.crt

これは次のようなものを表示するはずです:

Owner: CN=Example Web Service, O=Example, ST=Somewhere, C=GB
Issuer: CN=Example Web Service, O=Example, ST=Somewhere, C=GB
Serial number: 1fc84b98026e8b0b6d276ecbfc309dd7201bbb08
Valid from: Fri May 01 20:13:04 BST 2020 until: Thu Apr 21 20:13:04 BST 2022
Certificate fingerprints:
     SHA1: B4:F0:A3:26:C8:7A:75:B1:32:55:0A:EC:31:4F:93:20:53:35:3E:A6
     SHA256: F4:97:EA:08:52:03:4B:F4:FB:9F:64:88:69:E6:81:1E:28:95:F8:E3:39:FE:24:C0:48:40:70:33:70:4E:94:0B
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Extensions: 

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: F7 7F AA 69 52 DF 41 25   F2 F2 AC E7 5E D8 A7 43  ...iR.A%....^..C
0010: EF C9 92 50                                        ...P
]
]

#2: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
  serverAuth
]

#3: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

#4: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNSName: www.example.com
  DNSName: www.example.org
]

#5: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: F7 7F AA 69 52 DF 41 25   F2 F2 AC E7 5E D8 A7 43  ...iR.A%....^..C
0010: EF C9 92 50                                        ...P
]
]

最後に、結果に満足したら、必ず安全に保護されていない秘密鍵がある場合は削除してください。

1
garethTheRed