PKCS#11プロバイダ使用時の不具合について
特定のハードウェア(*1)とOS(*2)を使用時、java.securityパッケージAPIでjava.security.ProviderExceptionが発生、またはkeytool、jarsignerコマンドが正しく実行されない場合があります。
また、java.net.HttpURLConnectionでssl/tls通信をした場合、および、java.securityを内部で利用している以下のパッケージAPIでも発生する可能性があります。
javax.crypto
javax.net.ssl
javax.xml.crypto.dsig
javax.security.auth
javax.naming.directory
(*1) MAU(Modular Arithmetic Unit)を実装しているハードウェアが該当します。
(*2) Oracle Solaris 11.0 および Oracle Solaris 11.1が該当します。
例
java.securityパッケージAPI
Exception in thread "main" java.security.ProviderException: update() failed
at sun.security.pkcs11.P11Digest.engineUpdate(P11Digest.java:235)
at java.security.MessageDigest$Delegate.engineUpdate(MessageDigest.java:601)
at java.security.MessageDigest.update(MessageDigest.java:328)
at java.security.DigestInputStream.read(DigestInputStream.java:163)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at MDTest.main(MDTest.java:10)
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DATA_LEN_RANGE
at sun.security.pkcs11.wrapper.PKCS11.C_DigestUpdate(Native Method)
at sun.security.pkcs11.P11Digest.engineUpdate(P11Digest.java:227)
... 5 moreOracle Solaris 11.1では、UnrecoverableKeyExceptionが起因となるメッセージが出力される場合があります。
Exception in thread "main" java.io.IOException: Keystore was tampered with, or password was incorrect
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:792)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:57)
at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:71)
at java.security.KeyStore.load(KeyStore.java:1445)
at ReadCAcerts.main(ReadCAcerts.java:14)
Caused by: java.security.UnrecoverableKeyException: Password verification failed
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:790)
... 5 more例
keytool
-listオプション指定時
Your keystore contains 0 entries
-delete/-exportcertオプション指定時
keytool error: java.lang.Exception: Alias <xxxxx> does not exist
例
jarsigner
jarsigner error: java.security.ProviderException: update() failed
本不具合が発生した場合、以下のどちらかの方法で回避してください。
OSのカーネル暗号化フレームワークのpkcs11_kernelを無効にする
Oracle Solarisドキュメントのcryptoadmおよびpkcs11_kernelを参照して無効化してください。
例
使用例
cryptoadm uninstall provider=/usr/lib/security/\\$ISA/pkcs11_kernel.so
PCKS#11プロバイダを無効にする
以下のドキュメントを参照して無効化してください。
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/p11guide.html#Disable
SSL使用時のjavax.net.ssl.SSLExceptionについて
SSL使用時、使用するハードウェア・OSのパッチレベルによって、SSLExceptionが発生する場合があります。
例えば、以下のようなExceptionが発生する場合があります。
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate secret
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1842)
at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1825)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1346)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at com.sun.enterprise.admin.remote.RemoteAdminCommand.doHttpCommand(RemoteAdminCommand.java:665)
... 16 more
Caused by: java.lang.RuntimeException: Could not generate secret
at sun.security.ssl.ECDHCrypt.getAgreedSecret(ECDHCrypt.java:99)
at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:933)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:285)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
... 21 more
Caused by: java.security.InvalidKeyException: Could not derive key
at sun.security.pkcs11.P11ECDHKeyAgreement.nativeGenerateSecret(P11ECDHKeyAgreement.java:207)
at sun.security.pkcs11.P11ECDHKeyAgreement.engineGenerateSecret(P11ECDHKeyAgreement.java:174)
at javax.crypto.KeyAgreement.generateSecret(KeyAgreement.java:632)
at sun.security.ssl.ECDHCrypt.getAgreedSecret(ECDHCrypt.java:97)
... 28 more
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_ARGUMENTS_BAD
at sun.security.pkcs11.wrapper.PKCS11.C_DeriveKey(Native Method)
at sun.security.pkcs11.P11ECDHKeyAgreement.nativeGenerateSecret(P11ECDHKeyAgreement.java:195)
|
この場合、以下のプロパティをjavaコマンドに指定してください。
-Dcom.sun.net.ssl.enableECC=false |
鍵ペアの作成時間について
以下の機能により、RSAアルゴリズムで鍵ペアを作成する場合に、数分以上の作成時間がかかることがあります。
keytoolの-genkeypairまたは-genkeyオプションにより、鍵ペアを作成する場合
java.security.KeyPairGeneratorクラスのgenerateKeyPair()またはgenKeyPair()メソッドにより、鍵ペアを作成する場合
鍵ペアを作成する処理に時間がかかっている場合には、暗号アルゴリズムおよびkeysizeが意図した設定になっているか確認してください。
アプリケーションで鍵ペアを作成する場合は、作成時間の検証を行い、時間がかかる場合があることを考慮して、アプリケーションを作成してください。