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 more
Oracle 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が意図した設定になっているか確認してください。
アプリケーションで鍵ペアを作成する場合は、作成時間の検証を行い、時間がかかる場合があることを考慮して、アプリケーションを作成してください。