具有自签名证书的SSL连接错误(C套接字连接到Java服务器套接字)
起初。。。这个节目仅仅是一个有趣的节目,永远不会出版。它仅用于测试套接字,因此不必担心此连接的安全性。 我编写了一个小messenger,您可以在文本框中键入消息,它将被发送到服务器,并从服务器发送到所有客户端。到目前为止,一切顺利。只是为了好玩,我想在这个连接中使用SSL。 但当我尝试连接到服务器套接字时,它会在ValidateServerCertificate返回RemoteCertificateNameMismatch。 添加一些调试消息后,我发现Sslstream.LocalCertificate为null。如何修复丢失的证书?我正在使用自签名证书 请帮忙,这是我的密码。。。是的。。。对不起,我的英语不好:/: C客户机 [……] Java服务器套接字具有自签名证书的SSL连接错误(C套接字连接到Java服务器套接字),java,c#,certificate,server,self-signed,Java,C#,Certificate,Server,Self Signed,起初。。。这个节目仅仅是一个有趣的节目,永远不会出版。它仅用于测试套接字,因此不必担心此连接的安全性。 我编写了一个小messenger,您可以在文本框中键入消息,它将被发送到服务器,并从服务器发送到所有客户端。到目前为止,一切顺利。只是为了好玩,我想在这个连接中使用SSL。 但当我尝试连接到服务器套接字时,它会在ValidateServerCertificate返回RemoteCertificateNameMismatch。 添加一些调试消息后,我发现Sslstream.LocalCertif
如果您需要什么,请告诉我…RemoteCertificateNameMismatch策略错误与缺少的本地证书无关。此错误只是告诉您,接收到的服务器证书中的SAN使用者备选名称,或者,如果没有SAN,则接收到的服务器证书使用者名称的通用名称与您连接到的主机名不匹配。如果您不希望在这两个位置之一的证书中看到主机名,则可以忽略此错误 我猜您没有本地证书,因为您正在从文件加载证书,并且Windows私钥存储中没有此证书的相应私钥 尝试将证书和私钥(例如,使用MMC从同时具有证书和私钥的PFX文件)导入本地计算机个人证书存储,然后使用.NET证书存储API在此处加载该证书。只要您有权访问私钥(如果您是导入PFX的Windows用户,您将使用该私钥),那么您应该能够连接到此客户端证书 在代码中,不是从文件中读取证书,而是从证书存储中加载证书,如下所示:
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
try
{
X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
return TakeFirstCertificate(collection);
}
finally
{
store.Close();
}
你可以用指纹来寻找它,这只是一个例子。这就是您所选择的LocalCertificateReturn。有人刚刚问了一个类似的问题-但是,您在客户端使用的是C,我对此一无所知。但是基本问题是一样的,我想你可以很容易地用谷歌搜索例外情况。这对我没有帮助。。。我试图初始化SSLContext。。。但这给了我一个错误。我想你可以很容易地谷歌例外->我是。。。但是我发现没有什么有用的。谢谢你的回答!我要去看看这个。我会告诉你这是否对我有效:对不起。。。我对C代码真的是个新手。我以前只用Java编写代码。。。但是如何设置证书?我将.pfx添加到个人证书存储部分,但LocalCertificate仍然为空。。。我还搜索了.NET证书Api以将证书分配给我的应用程序,但没有找到任何东西…@Wlad4Coding我用一些C代码更新了我的答案,以从当前用户的个人证书存储中查找证书。
package de.wladhd.server;
import java.net.Socket;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import de.wladhd.client.Client;
import de.wladhd.client.ClientManager;
import de.wladhd.logs.Log;
import de.wladhd.logs.LogType;
public class DateServer {
private SSLServerSocket server;
private boolean running = true;
private String keyStore = "D:/Wlad/Programmierung/Zertifikat/CA/CertificateAuthority.pfx";
private String keyStorePassword = "...";
private String keyStoreType = "PKCS12";
private String trustStore = "D:/Wlad/Programmierung/Zertifikat/CA/CertificateAuthority.pfx";
private String trustStorePassword = "...";
private String trustStoreType = "PKCS12";
public void execute() throws Exception {
//System.setProperty("javax.net.debug","all");
System.setProperty("javax.net.ssl.keyStoreType", keyStoreType);
System.setProperty("javax.net.ssl.keyStore", keyStore);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
System.setProperty("javax.net.ssl.trustStoreType", trustStoreType);
System.setProperty("javax.net.ssl.trustStore", trustStore);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
//System.setProperty("javax.net.ssl.trustStore", "de.wladhd.server.Trusting");
SSLServerSocketFactory serverFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
if(serverFactory == null) {
new Log("Error occured... Server Factory == null!", LogType.ERROR);
return;
}
server = (SSLServerSocket) serverFactory.createServerSocket(9090);
running = true;
new Log("Server now running on query: " + server.getInetAddress().getHostAddress() + ":" + server.getLocalPort(), LogType.INFO);
while (running) {
try {
if(server.isClosed()) {
return;
}
new Log("Client connecting...", LogType.DEBUG);
final Socket rawsocket = server.accept();
if(!(rawsocket instanceof SSLSocket)) {
new Log("Client isnt an instance of SSLSocket!", LogType.DEBUG);
return;
}
final SSLSocket socket = (SSLSocket) rawsocket;
try {
socket.startHandshake();
} catch (Exception ex) {
}
new Log("Client - Connected: " + socket.isConnected(), LogType.DEBUG);
new Log("Client - Protocol: " + socket.getSession().getProtocol(), LogType.DEBUG);
new Log("Client - Session valid: " + socket.getSession().isValid(), LogType.DEBUG);
new Log("Client - CipherSuite: " + socket.getSession().getCipherSuite(), LogType.DEBUG);
new Log("Client - NeedClientAuth: " + socket.getNeedClientAuth(), LogType.DEBUG);
new Log("Client - WantClientAuth: " + socket.getWantClientAuth(), LogType.DEBUG);
Client c = new Client(socket);
//socket.getHandshakeSession() returns null and peer not authenticated exception...
} catch (Exception ex) {
ex.printStackTrace();
continue;
}
}
}
public void disconnect() throws Exception {
new Log("Server disconnecting...", LogType.INFO);
setRunning(false);
ClientManager.getInstance().disconnectClients();
if(server != null) {
server.close();
}
new Log("Server successfully disconnected!", LogType.INFO);
}
public boolean isRunning() {
return running;
}
public void setRunning(boolean state) {
running = state;
}
}
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
try
{
X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
return TakeFirstCertificate(collection);
}
finally
{
store.Close();
}