3

我必须使用预共享密钥与远程服务器建立 TLS 连接。我目前正在使用 Bouncycastle 的 PSKTlsClient。我的初始化代码如下所示:

 socket_ = new Socket(address,port);            
 tlsHandler_ = new TlsProtocolHandler(socket_.getInputStream(),socket_.getOutputStream());           
 pskTlsClient_ = new PSKTlsClient(tlsPskInfo_);            
 tlsHandler_.connect(pskTlsClient_);

但是我得到了这个堆栈跟踪:

java.io.IOException: Internal TLS error, this could be an attack
at org.bouncycastle.crypto.tls.TlsProtocolHandler.failWithError(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocolHandler.safeReadData(Unknown Source)
at org.bouncycastle.crypto.tls.TlsProtocolHandler.connect(Unknown Source)
at common.network.Transport.PskTlsClientSocket.connect(PskTlsClientSocket.java:61)

我还在消息中得到了一个 TLS 证书,PSK 是在其中传输的,但是我不知如何建立这个连接。你有什么建议如何进行吗?

4

1 回答 1

7

解决了。问题是,在 java bouncycastle 库中,进程服务器证书方法没有实现并且总是抛出一个内部错误。所以我不得不实施这个并且在那之后一切都很好。

编辑:在 TlsPSKKeyExchange.java 中将以下方法更改为:

public void processServerCertificate(Certificate serverCertificate) throws IOException
{
    SubjectPublicKeyInfo subPubKeyInfo = serverCertificate.certs[0].getTBSCertificate().getSubjectPublicKeyInfo();
    RSAPublicKey pubKey = RSAPublicKey.getInstance(subPubKeyInfo.getPublicKey());
    rsaServerPublicKey = new RSAKeyParameters(false,pubKey.getModulus(),pubKey.getPublicExponent());
}

第一个证书中的第一个公钥用于 RSA 加密。

于 2012-07-01T21:30:55.023 回答