【发布时间】:2016-11-27 15:09:11
【问题描述】:
目标:客户端应该将数据发送到受信任的服务器(通过自签名证书)和服务器相同。
我正在运行 Node.js TLS 服务器,并且有许多在 C 中运行 openSSL TLS 客户端的嵌入式客户端。我已经完成了整个设置,并且可以看到数据已加密(通过 Wireshark),但我不相信我以正确的方式做事(尤其是我处理证书的方式)。
我目前所拥有的
- 在服务器上,我生成了一个 2048 私钥 (private-key.pem) 和一个自签名证书 (public-cert.pem)
- 将自签名证书 (public-cert.pem) 复制到客户端
Node.js 服务器代码 sn-p
var tls = require('tls');
var fs = require('fs');
var options = {
key: fs.readFileSync('private-key.pem'),
cert: fs.readFileSync('public-cert.pem')
};
tls.createServer(options, function (socket) {
socket.on('data', function(data) {
// do something
});
socket.on('close', function() {
socket.destroy();
});
}).listen(PORT);
C 客户端代码 sn-p
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
OpenSSL_add_all_algorithms();
// create new context object
ctx = SSL_CTX_new(TLSv1_2_client_method());
//load trust cert
if(! SSL_CTX_load_verify_locations(ctx, "public-cert.pem", NULL)){
printf("sslInitialize() Error: Cannot load certificate\n");
ERR_print_errors_fp(stderr);
if(ctx != NULL) {
SSL_CTX_free(ctx);
}
return;
}
bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, & ssl);
if (ssl == NULL) {
printf("sslInitialize() Error: Can't locate SSL pointer\n");
ERR_print_errors_fp(stderr);
if(ctx != NULL){
SSL_CTX_free(ctx);
}
if(bio != NULL){
BIO_free_all(bio);
}
return;
}
BIO_set_conn_hostname(bio, HOST);
int connectStatus;
if((connectStatus = BIO_do_connect(bio)) <= 0) {
printf("Connect Status: %d",connectStatus);
printf("sslInitialize() Error: Cannot connect to server\n");
ERR_print_errors_fp(stderr);
sslCloseConnection();
return;
}
观察
- 我将客户端上的证书更改为相同的随机证书,它仍然有效(服务器在 ServerHello TLS 握手期间发送的证书和使用 SSL_CTX_load_verify_locations() 加载的客户端不同)。这让我想知道客户如何信任证书。 我该如何解决这个问题?
- 到目前为止,我已将其设置为客户端验证服务器(尽管它不工作)并发送数据,而服务器盲目地接受它。 如何让客户端发送证书(由客户端自签名),并且服务器仅在文件中包含该特定证书时才接受它。
- 在客户端我使用
SSL_CTX_load_verify_locations(ctx, cert, NULL)。文档说
指定 ctx 的位置,用于验证的 CA 证书所在的位置。通过 CAfile 和 CApath 获得的证书是可信的。
这是否意味着客户端会根据在 TLS 握手的 ServerHello 消息中收到的证书进行检查?如果是这样,我应该调用另一个函数来进行此检查吗?
- 与往常一样,在提出这个问题之前,我已经浏览了很多在线资源(SO 帖子和 openSSL 手册页)。 Node.js_TLS,openSSL,SO_1,SO_2 仅举几例。我还省略了头文件和其他样板代码。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
查看 OpenSSL wiki 上的 TLS Client。它包含您可能会觉得有用的信息。
-
谢谢!这很有帮助。
标签: c node.js ssl openssl ssl-certificate