- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这就是我生成 SSL 证书、 key 等的方式:
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 未验证证书异常。保留该行后,我得到一个身份验证失败异常。
这里有 2 个更长的代码片段,可以更好地理解上述片段。
服务器:
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();
感谢您花时间阅读本文。如果有明显的错误,我会很高兴听到它。长期以来,这一直是我生存的祸根。太长了。
最佳答案
看起来您正在生成自签名证书(这很好),但是您使用 openssl
实用程序进行的操作令人困惑。
第一行OK,生成私钥。
第 2 行没用:输出键与输入键相同! (尝试diff
这两个键来查看)。
第 3 行生成一个 CSR,第 4 行实际上对其进行自签名,因此我们将看到它们可以合并在一行中。
现在,让我们退后一步,试着理解我们在做什么:-)
您正在使用 SSL 对 Thrift 服务器和 Thrift 客户端之间的通信进行身份验证和加密。我假设你想要两者:
打个 HTTPS 的比方,(1) 是经典的服务器证书,(2) 通常是用户的用户名/密码。但是使用 Thrift 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 (e.g. server FQDN or YOUR name)"
时,输入运行 Thrift 程序的主机的 FQDN .这将允许不自定义 Thrift 的 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) {
....
}
其中myKey
是server-key.pem
,myCert
是server-cert.pem
和trustedCerts
是……受信任 CA 的证书,或者在自签名证书的情况下,是客户端的证书。您可以在同一个文件中一个接一个地cat
多个证书。在我们的示例中,我们将放置我们之前创建的 client-cert.pem
。
客户端的 SSL 序言完全相同,具有正确的客户端私钥、客户端证书,对于 trustedCerts
,还有对等方的证书:server-cert.pem
我们之前创建的。
就这些:-) 在开始编写代码之前尝试理解,如果您不清楚 SSL(相互)身份验证的工作原理,则很难理解错误消息。我展示的代码已经过测试可以正常工作。
文档方面,不幸的是 Thrift 几乎没有。对于 SSL,您可以查看:lib/cpp/README.SSL
、test/cpp/src/TestServer.cpp
和 test/cpp/src/TestClient。 cpp
。请注意,TestServer.cpp
不进行相互身份验证,恕我直言,这是一个错误。
关于c++ - SSL 证书,不通过 thrift 进行身份验证,但可以通过浏览器进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964755/
我在 Cloudflare 的域名服务器上有一个域名 example.com。该域指向我的专用服务器的 IP 地址,该服务器运行 CentOS/WHM/cPanel。该站点可访问 - 一切都很好。 我
我正在努力将 SSL 支持添加到我们现有的应用程序中,并已开始考虑向后兼容性。 与我读过的其他帖子不同的一个特殊情况是服务器可能不一定使用 SSL 代码更新。所以我将有一个 SSL 客户端连接到一个对
我有几个 https://*.rest-service.mydomain.com。随着服务数量的增加,我觉得管理 SSL 证书的成本很高。我为 *.mydomain.com 购买了通配符证书。 新添加
我的客户要求我在他的网站上做反向 ssl。但我是这个学期的新手。谁能帮我解决这个问题。 请描述或引用如何做。 最佳答案 查看 this wiki article . In the case of se
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 去年关闭。 Improve this
我连接到我的网络服务器上的存储库,但是当我尝试推送我的更改时,它显示:“错误 403:需要 ssl”,但在我的存储库设置中我已经激活了 ssl 选项。 有什么建议吗? 最佳答案 当您连接到存储库时,您
抱歉,如果这听起来像是转储问题,我已经阅读了很多关于 SSL 握手和 SSL 工作原理的文章和文档。我对一件事感到困惑,如果有人能澄清我就太好了。 我知道私钥要保密。但是我已经看到通过在请求中指定私钥
随着物联网越来越主流,越来越需要从硬件发送http请求。 一个主要问题是硬件微 Controller 无法发送 ssl 请求,但大多数服务器/网站/服务都在使用 ssl。 所以,问题是,有没有桥(一个
我有一个 ssl 页面,它还从非 ssl 站点下载头像。我能做些什么来隔离该内容,以便浏览器不会警告用户混合内容吗? 最佳答案 只是一个想法 - 或者: 尝试在头像网站上使用 ssl url,如有必要
我在 Digital Ocean droplet(使用 nginx)上设置了两个域。我已经在其中一个(domain1)中安装了一个 SSL 证书,并且那个证书一切正常。第二个域 (domain2) 不
我收到这个错误: Error frontend: 502 Bad gateway 99.110.244:443 2017/09/28 13:03:51 [error] 34080#34080: *10
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 6 年前。 Improve
我遇到了一个问题,我正在构建一个 nginx 反向代理以定向到不同 url 路径上的多个微服务。 该系统完全基于 docker,因此开发和生产使用相同的环境。这在安装 SSL 时给我带来了问题,因为
所以我知道要求 SSL 证书和接受之间的根本区别,一个意味着您必须拥有 SSL 证书,另一个意味着您不需要。 在某个网页的 IIS 管理器中,我有以下设置: 我遇到的问题是,当我设置需要 SSL 证书
我今天才发现 .app 域名需要 SSL 证书。我购买它是为了将 DNS 重定向到已经设置了 SSL 证书的站点,所以我的问题是是否可以设置它? 我正在使用 Google Domains,在将合成临时
堆栈 : react ,NGINX 1.14.0,GUnicorn,Django 2.2.8,Python 3.6.9 错误 : 在浏览器:当 React 调用 Django API(当然是在请求头中
假设我在计算机上编辑主机文件以使 google.com 指向我的 VPS 服务器 IP,并且服务器具有通过 Apache 或 Nginx 配置的 google.com 的虚拟主机/服务器 block
我有一个场景,我正在处理用于 URL 路由的 IIS 网站配置。我已添加网站并在服务器上导入所需的证书。 我的情况是(我有多个网站 URL 和两个 SSL 证书 - 如下所示): qatest1.ab
我知道服务器发送的证书无法伪造(仍然存在 MD5 冲突,但成本高昂),但是伪造客户端又如何呢?在中间人攻击中:我们不能告诉服务器我们是合法客户端并从该服务器获取数据并对其进行操作,然后使用合法客户端公
我已通读相关问题,但无法完全找到我要查找的内容。我设置了一个名为“domain.com”的域,并创建了两个子域“client.domain.com”和“client-intern.domain.com
我是一名优秀的程序员,十分优秀!