SSL证书,通过节俭不认证,而是通过浏览器OK(SSL Certificate, not authe

2019-06-25 09:45发布

这是我生成我的SSL证书,密钥等:

openssl genrsa -out server.key 1024
openssl rsa -in server.key -out new_key.pem
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 10000 -in server.csr -signkey new_key.pem -out server.crt

这工作,我可以在Chrome中看到输出,虽然我得到,我要首先得到病毒警告。

openssl s_server -cert server.crt -www -key new_key.pem

这是从服务器上的一个片段。 我会说实话,我不知道到底是什么每一行正在做,但我有一个好主意:

socketFactory->server(true); // this is the server
socketFactory->authenticate(false); // no auth?
socketFactory->loadCertificate("server.crt"); 
socketFactory->loadPrivateKey("new_key.pem");

客户:

socketFactory->loadTrustedCertificates("server.crt");
socketFactory->authenticate(true); //auth? wierd, right? This guy does this:[1]

[1] http://permalink.gmane.org/gmane.comp.lib.thrift.user/1651

如果我注释掉loadTrustedCertificates在客户端上,然后我得到一个未经验证SSL证书例外。 随着该行留在,我得到一个身份验证失败例外。

这里有两个长得多的代码片段,是把上面的代码片段更好的角度。
服务器:

shared_ptr<SkullduggeryHandler> handler(new SkullduggeryHandler());
shared_ptr<TBufferedTransportFactory> transportFactory =
        shared_ptr<TBufferedTransportFactory>(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
shared_ptr<TProcessor> processor(new SkullduggeryProcessor(handler));
shared_ptr<TSSLSocketFactory> socketFactory = 
      shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
socketFactory->server(true);
socketFactory->authenticate(false);
socketFactory->loadCertificate("server.crt");
socketFactory->loadPrivateKey("new_key.pem");
shared_ptr<TSSLServerSocket> socket(new TSSLServerSocket(port, socketFactory));
TThreadedServer server(processor,
                               socket,
                               transportFactory,
                               protocolFactory);
server.serve();

客户:

shared_ptr <TSSLSocketFactory> socketFactory = shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
socketFactory->loadTrustedCertificates("server.crt");
socketFactory->authenticate(false);
shared_ptr <TSSLSocket>socket = socketFactory->createSocket(configuration.ip, configuration.port);
shared_ptr<TBufferedTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
SkullduggeryClient client(protocol);
transport->open();

感谢您抽时间阅读。 如果有明显的错误,我会很高兴听到它。 这一直是我的存在性的祸根太久了。 太长。

Answer 1:

看来要生成自签名证书(这是好的),但你与制造业务openssl工具是混乱。

1号线是确定的,它会生成一个私钥。
2号线是没用的:输出键是一样的输入键! (尝试diff两个键查看)。
3号线生成CSR和4号线实际自我的迹象,所以他们可以在一个线路合并在一起,我们将会看到。

现在,让我们退后一步,让我们试着去了解我们在做什么:-)

您正在使用SSL验证和加密节俭服务器和客户端节俭之间的通信。 我想,你希望这两个:

  1. 从流氓服务器保护客户端(你的代码是试图做)
  2. 防止恶意的客户端服务器(这似乎更重要的是我)。

为了使一个HTTPS类比,(1)是经典的服务器证书,(2)通常是该用户的用户名/密码。 但随着储蓄SSL,我们将颁发证书也给客户端获得的相互认证。

我将做出的例子将使用自签名的证书。 他们可以很容易地适应由OpenSSL的管理一个小型CA,我离开这个作为练习读者。

生成服务器私钥:
openssl genrsa -out server-key.pem 2048

生成相关的公共密钥和自签名:
openssl req -new -x509 -key server-key.pem -out server-cert.pem -days 10000

生成客户端私钥:
openssl genrsa -out client-key.pem 2048

生成相关的公共密钥和自签名:
openssl req -new -x509 -key client-key.pem -out client-cert.pem -days 10000

注:当openssl req询问"Common Name (eg server FQDN or YOUR name)" ,把FQDN上的节俭计划将运行的主机。 这将允许不定制节俭的AccessManager类。 如果在另一方面的FQDN不能预先知道,需要继承AccessManager并重写verify()相应的方法。 见TSSLSocket.cpp

好,现在到了代码。

在服务器端:

socketFactory->server(true); 是多余的,将其删除。

socketFactory->authenticate(false)是有点误导。 一个更好的名字本来authenticatePeer 。 如果你说false ,它不会验证客户端,但我们决定我们要相互验证之前。

因此,对于服务器的SSL序言是:

try {
    signal(SIGPIPE, SIG_IGN); // See README.SSL
    shared_ptr<TSSLSocketFactory> sslSocketFactory(new TSSLSocketFactory());
    sslSocketFactory->loadPrivateKey(myKey);
    sslSocketFactory->loadCertificate(myCert);
    sslSocketFactory->authenticate(true);
    sslSocketFactory->loadTrustedCertificates(trustedCerts);
    sslSocketFactory->ciphers("HIGH:!DSS:!aNULL@STRENGTH");
    ...
    } catch (TException& tx) {
        ....
    }

其中myKeyserver-key.pemmyCertserver-cert.pemtrustedCerts是...或者是信任的CA的证书,或在自签名的证书,客户端的证书的情况。 你可以cat多个证书一个接一个在同一个文件之后。 在我们的例子中,我们将会把client-cert.pem我们之前创建的。

对于客户端通过SSL序言是完全一样的,用正确的客户私有密钥,客户端证书,并为trustedCerts ,同行的证书: server-cert.pem我们之前创建的。

这是所有:-)尝试跳转到代码时,如果你没有怎么SSL(相互)认证工作的清晰画面之前要了解,这是很难理解的错误消息。 我发现的代码进行测试工作。

文档明智的,不幸的是节俭是几乎为零。 对于SSL,可以看到: lib/cpp/README.SSLtest/cpp/src/TestServer.cpptest/cpp/src/TestClient.cpp 。 被警告, TestServer.cpp没有做相互认证,这是一个错误恕我直言。



文章来源: SSL Certificate, not authenticating via thrift, but OK via browser