Hes*_*era 6 .net java ssl self-signed x509certificate
我正在学习SSL,在这个过程中,我试图在.NET服务器和Java客户端之间创建SSL连接.我为此目的使用自签名证书.我不想在Java中使用标准密钥库,因此我创建了一个自定义密钥库并将其加载.
我使用以下步骤生成证书和要在.NET服务器端使用的pfx文件.
在Windows上使用以下命令生成cerficiate.
makecert -r -pe -sr"localhost" - $ individual -n"CN = localhost"-sv .pvk -r localhost.cer
将其转换为.pfx,以便我可以在.NET服务器应用程序上加载此证书.
将.cer文件导出为.pem(Base64格式).
获取.cer文件(上述证书的公共组件)并使用以下命令创建一个.jks文件(JavaKeyStore)以用作Java客户端.
keytool\-import\-v\-trustcacerts\-alias 0\-file <(openssl x509 -in localhost.pem)\ -keystore mystore.jks\-storetype JKS\-storepass ez24get
在Java客户端应用程序中加载此.jks并使用以下代码启动连接
Run Code Online (Sandbox Code Playgroud)FileInputStream fis = new FileInputStream("res/myjksstore.jks"); KeyStore trusted = KeyStore.getInstance("JKS"); trusted.load(fis, "ez24get".toCharArray()); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trusted); SSLContext context = SSLContext.getInstance("SSL"); context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); Socket socket = context.getSocketFactory().createSocket("localhost", 443); String str = "abc123"; socket.getOutputStream().write(GeneralUtil.toByta(str.length())); socket.getOutputStream().write(str.getBytes()); socket.setKeepAlive(true);
但是当我尝试将数据写入套接字时,我在服务器端收到以下错误
System.ComponentModel.Win32Exception:客户端和服务器无法通信,因为它们没有通用的算法
我的服务器代码如下所示......
X509Certificate cert = new X509Certificate("localhost.pfx","abc123");
TcpListener listener = new TcpListener(IPAddress.Loopback,443); listener.Start();
while(true){
try {TcpClient tcpClient = listener.AcceptTcpClient();
Run Code Online (Sandbox Code Playgroud)NetworkStream networkStream = tcpClient.GetStream(); SslStream sslStream = new SslStream(networkStream); sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default,假);
Run Code Online (Sandbox Code Playgroud)byte[] data1 = new byte[4]; sslStream.Read(data1, 0, data1.Length); int len = BitConverter.ToInt32(data1, 0); String message = "Length of incoming data " +BitConverter.ToInt32(data1,0);
Run Code Online (Sandbox Code Playgroud)byte[] data2 = new byte[len]; sslStream.Read(data2, 0, data2.Length); message += " Message: " + ASCIIEncoding.ASCII.GetString(data2); Thread.Sleep(1000);} catch(Exception ex)
{
}}
该行发生异常
sslStream.AuthenticateAsServer(cert,false,SslProtocols.Default,false);
可能是什么原因,我该如何解决?
任何帮助将受到高度赞赏.
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |