@ Стивен C / @FelixM: IBM, похоже, совершенно не знает, как работает криптография RSA и как она предназначена для использования. В основном обе операции (шифрование / дешифрование) должны быть доступны для открытого и закрытого ключа.
Шифрование с открытым ключом необходимо для передачи клиентской части предварительного главного секрета при рукопожатиях SSL / TLS. Сервер должен расшифровываться с помощью своего закрытого ключа. Но если они договариваются о чем-то вроде ECDHE_RSA, серверу необходимо ПОДПИСАТЬ части рукопожатия с закрытым ключом - это шифруется с помощью PrivateKey. Наоборот, клиент должен расшифровать с помощью открытого ключа из сертификата сервера, чтобы проверить значение хэша подписи. (подтверждение подлинности сообщения)
Поэтому, если я попытаюсь запустить ECDHE_RSA (на стороне сервера) в последней версии IBM JDK 7, произойдет следующее:
java.security.InvalidKeyException: Private key cannot be used to encrypt.
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.lang.Thread.run(Thread.java:777)
at com.ibm.crypto.provider.RSASSL.engineInit(Unknown Source)
at javax.crypto.Cipher.init(Unknown Source)
at javax.crypto.Cipher.init(Unknown Source)
at java.security.Signature$CipherAdapter.engineInitSign(Signature.java:1239)
at java.security.Signature$Delegate.init(Signature.java:1116)
at java.security.Signature$Delegate.chooseProvider(Signature.java:1076)
at java.security.Signature$Delegate.engineInitSign(Signature.java:1140)
at java.security.Signature.initSign(Signature.java:522)
at net.vx4.lib.tls.core.TLSSignature.createSignature(TLSSignature.java:120)
Как вы можете видеть, мы используем "Signature" и вызываем "initSign", что действительно требует PrivateKey. Это доказывает, что IBM ничего не знает об этом факте, и, очевидно, они даже не
иметь действительные регрессионные тесты!
Воспользуйтесь другим провайдером шифрования и не верьте IBM, пока они не передумают.
С наилучшими пожеланиями,
Christian