使用Bouncycastle与PSK建立TLS连接

nux*_*nux 3 java sockets ssl cryptography bouncycastle

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

 socket_ = new Socket(address,port);            
 tlsHandler_ = new TlsProtocolHandler(socket_.getInputStream(),socket_.getOutputStream());           
 pskTlsClient_ = new PSKTlsClient(tlsPskInfo_);            
 tlsHandler_.connect(pskTlsClient_);
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

我还在消息中获得了TLS证书,其中传输了PSK,但我不知道如何建立这种连接.你有什么建议怎么办吗?

nux*_*nux 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());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我不确定相关的时间,但最新版本的 BC (1.49) 已经实现了 TlsPSKKeyExchange.processServerCertificate,因此不再需要进行此更改。 (2认同)