2012-06-22 66 views
3

我必须通过预共享密钥建立到远程服务器的TLS连接。我目前使用Bouncycastle的PSKTlsClient。我的初始化代码看起来像这样:使用Bouncycastle与PSK的TLS连接

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) 

我也是消息,该PSK传输中得到了TLS证书,但我莫名其妙地卡住了怎么建立这种联系。你有什么建议如何继续?

回答

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加密。

+0

您能否为他人发布示例代码片段? – sharjeel

+0

我刚更新了帖子,并添加了代码 – nux

+0

感谢您报告返回nux。 –