- 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/
我的“登录”是在 IE 浏览器中进行的,登录后,如果我单击链接,它们就会在 Chrome 浏览器中打开。如何在同一个测试用例中将我当前的浏览器从 IE 切换到 Chrome。如果我创建一个 chrom
您好,我不明白在 Firefox 的内容属性中使用的特殊字符的不同显示行为。我已经剥离了一切并创造了一支笔: http://codepen.io/rpkoller/pen/Fbgav 在其“基本形式”
我正在研究 Spring Data REST,特别是 HAL 浏览器。我一直在关注 http://docs.spring.io/spring-data/rest/docs/current/refere
我正在使用工具提示,在 ie 上出现定位错误。我放了jquery浏览器代码 我的工具提示 $('.tooltip').tooltip({ position: "bottom center"
我应该如何处理蓝鸟协程中的错误? 我使用co in节点已有一段时间,它具有出色的捕获功能。 co(function*() { return new Promise(function(resol
package webviewbrowser; import java.util.List; import javafx.application.Application; import javafx.
我有一些 JavaScript 在同一域上的两个独立服务器之间共享请求。 .com 是 JavaScript 中域的要求吗? 在这种情况下,两台服务器都位于 .abc.tyy 域上,tyy 通常是 .
package webviewbrowser; import java.util.List; import javafx.application.Application; import javafx.
我正在尝试构建仍支持 NPAPI 的先前版本的 Chromium 浏览器。我已经获得了代码,并且可以使用 stand build 命令在我的 mac 上构建最新版本的 Chromium gclient
我环顾四周,找不到 browscap 的 Python 等效项(我在 PHP 中使用它来检测给定的用户代理字符串是什么浏览器。 我希望我不必自己写......:P 最佳答案 看看这个,它应该做你想要的
是否有任何 chrome 或 firefox 扩展允许 javascript 在客户端 PC 中创建写入文件? 最佳答案 你想做什么? HTML5 有一个 File API .这是最好的解决方案,因为
当我点击链接或刷新或关闭标签页时,我有这段代码会发出警报。 但我需要在关闭 窗口(选项卡)上仅 发出警报。怎么做? 我的网站上有很多外部和内部链接。
我目前正在尝试使用 Browserify + Angular,但我遇到了一个奇怪的问题。我在我的 Controller 的子目录中创建了一个名为 controllers/start-controlle
我正在为客户(项目已被接受,但现在是解释不同功能的问题)写一份详细的估算,以开发一个响应式布局的网站。 这不是我第一次进行此类开发,但这是一个关键客户,必须铺平道路。 布局将从 300px 宽度调整到
我在时事通讯上设计了一些黑底白字。由于时事通讯在打印时看起来不错且可读。我需要使布局和文本与浏览器中的内容相似。 通常情况下,黑色文本和无背景颜色是浏览器/网络邮件客户端的默认打印样式吗? 最佳答案
我有一个使用 GWT/mGWT 构建的移动友好网络应用程序。该应用程序有白色输入文本框和深灰色输入文本。但是,在 Android 浏览器上,文本显示为白色,因此是不可见的。我尝试的所有 CSS 都无法
我创建了一个带有选择输入的页面来更改正在使用的 jQuery UI 主题。当主题更改时,它会存储在 cookie 中。页面加载时,如果 cookie 存在,则恢复主题,否则加载默认主题。 当我使用 F
在我的 CSS 中,我使用了以下代码片段: word-break: break-word; -webkit-hyphens: auto; hyphens: auto; 渲染引擎如何知道在所有不同语言中
我的网络浏览器 Safari 有问题,我在 Chrome、FireFox 中测试了我的网站。 Safari 版本也是正确的,但是,当需要在 1920x1080 或更高分辨率下对其进行测试时,它无法正常
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是一名优秀的程序员,十分优秀!