- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我申请了ssl,但结果并不令人满意。使用wireshark查看时,服务器和客户端之间没有关键变化。
沟通是可能的,但并不令人满意。服务器是 Linux,客户端使用的是 Chrome。
我知道正常的 ssl 通信消息是
" 客户端 key 交换、密码更改规范、加密握手消息 "
和
“ 服务器问候,证书,服务器 key 交换,服务器问候完成 ”。但它对我来说是不可见的。
代码
#include <iostream>
#include <cpprest/http_listener.h>
#include <cpprest/json.h>
using namespace web;
using namespace web::http;
using namespace web::http::experimental::listener;
int main(){
http_listener_config listen_config;
listen_config.set_ssl_context_callback([](boost::asio::ssl::context &ctx)
{
ctx.set_options(
boost::asio::ssl::context::default_workarounds
| boost::asio::ssl::context::no_sslv2
| boost::asio::ssl::context::no_tlsv1
| boost::asio::ssl::context::no_tlsv1_1
| boost::asio::ssl::context::single_dh_use);
ctx.set_password_callback([](std::size_t max_length, boost::asio::ssl::context::password_purpose purpose)
{
return "password";
});
ctx.use_certificate_chain_file("rootca.crt");
ctx.use_private_key_file("rootca.key", boost::asio::ssl::context::pem);
ctx.use_tmp_dh_file("dh2048.pem");
});
listen_config.set_timeout(utility::seconds(10));
http_listener listener(U("https://0.0.0.0:10022"), listen_config); //Server URL, Port .
listener.support(methods::GET, [](http_request req){
auto j = json::value::object();
auto path = req.request_uri().path();
std::cout << path << std::endl;
j[U("one")] = json::value::string(U("asdfasefasdfaefasdfasefasdfefasefasefaqf3wfsefasdfasefasdfzsfzdfaesfzsefzsdfzsef"));
req.reply(status_codes::OK, j);
});
listener.open().then([&listener](){std::cout << (U("\n start!!\n"));}).wait(); //Server open
while(true);
listener.close();
return 0;
}
客户端连接到服务器时的数据包。
最佳答案
不,这不行:
做一个
openssl s_client -connect :10022 -debug -showcerts -state
节目
CONNECTED(00000005)
write to 0x5614f8b23690 [0x5614f8b33620] (311 bytes => 311 (0x137))
0000 - 16 03 01 01 32 01 00 01-2e 03 03 79 fe 76 37 2b ....2......y.v7+
0010 - 9f bf e7 62 51 34 7d 4a-00 5e 1f ed 55 64 61 e1 ...bQ4}J.^..Uda.
0020 - 44 ce a0 c0 31 eb 3a b0-80 78 87 20 70 c4 1f 56 D...1.:..x. p..V
0030 - 62 da 74 b7 d7 6a 31 50-0c 8c 90 46 23 c6 59 13 b.t..j1P...F#.Y.
0040 - 17 6c 67 8f e3 9a 85 77-ab 6e c2 a3 00 3e 13 02 .lg....w.n...>..
0050 - 13 03 13 01 c0 2c c0 30-00 9f cc a9 cc a8 cc aa .....,.0........
0060 - c0 2b c0 2f 00 9e c0 24-c0 28 00 6b c0 23 c0 27 .+./...$.(.k.#.'
0070 - 00 67 c0 0a c0 14 00 39-c0 09 c0 13 00 33 00 9d .g.....9.....3..
0080 - 00 9c 00 3d 00 3c 00 35-00 2f 00 ff 01 00 00 a7 ...=.<.5./......
0090 - 00 00 00 0e 00 0c 00 00-09 6c 6f 63 61 6c 68 6f .........localho
00a0 - 73 74 00 0b 00 04 03 00-01 02 00 0a 00 0c 00 0a st..............
00b0 - 00 1d 00 17 00 1e 00 19-00 18 00 23 00 00 00 16 ...........#....
00c0 - 00 00 00 17 00 00 00 0d-00 30 00 2e 04 03 05 03 .........0......
00d0 - 06 03 08 07 08 08 08 09-08 0a 08 0b 08 04 08 05 ................
00e0 - 08 06 04 01 05 01 06 01-03 03 02 03 03 01 02 01 ................
00f0 - 03 02 02 02 04 02 05 02-06 02 00 2b 00 09 08 03 ...........+....
0100 - 04 03 03 03 02 03 01 00-2d 00 02 01 01 00 33 00 ........-.....3.
0110 - 26 00 24 00 1d 00 20 a1-ab 9c 0d 7e e9 80 84 ba &.$... ....~....
0120 - 0a 5a 71 20 7d 59 cd d9-24 9c de 9a 05 9d a2 78 .Zq }Y..$......x
0130 - 0d 0d 79 a1 3b 65 58 ..y.;eX
read from 0x5614f8b23690 [0x5614f8b2a313] (5 bytes => 0 (0x0))
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 311 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
read from 0x5614f8b23690 [0x5614f8b18d80] (8192 bytes => 0 (0x0))
所以我得到了不安全的回退。事实证明,未处理的异常会导致真正退化的行为。添加一些异常处理显示:
ERROR: use_certificate_chain_file: No such file or directory
嗯,当然。添加那些:
NOTE: It seems unlikely that you'd actually use a rootca for the sever. Maybe change the name of the file to reflect what it contains, or reconsider the cert you use for a server purpose.
ctx.set_password_callback(
[](std::size_t /*max_length*/,
ssl::context::password_purpose /*purpose*/) {
return "test";
});
ctx.use_certificate_chain_file("server.pem");
ctx.use_private_key_file("server.pem", ssl::context::pem);
ctx.use_tmp_dh_file("dh2048.pem");
Note, I used the key/dh params from the boost SSL samples, so the passphrase is test
s_client
再次或使用类似
wget
:
wget --no-check-certificate https://localhost:10022/ -O - -q
{"one":"asdfasefasdfaefasdfasefasdfefasefasefaqf3wfsefasdfasefasdfzsfzdfaesfzsefzsdfzsef"}
概括
ssl::context
的所有这些参数可能一直在有效地要求这一点。
#include <cpprest/http_listener.h>
#include <cpprest/json.h>
#include <iostream>
using namespace web;
using namespace web::http;
using namespace web::http::experimental::listener;
namespace net = boost::asio;
namespace ssl = net::ssl;
int main() {
http_listener_config listen_config;
listen_config.set_ssl_context_callback([](ssl::context& ctx) {
try {
std::clog << "set_ssl_context_callback" << std::endl;
ctx.set_options(ssl::context::default_workarounds |
ssl::context::no_sslv2 | ssl::context::no_tlsv1 |
ssl::context::no_tlsv1_1 |
ssl::context::single_dh_use);
ctx.set_password_callback(
[](std::size_t /*max_length*/,
ssl::context::password_purpose /*purpose*/) {
return "test";
});
ctx.use_certificate_chain_file("server.pem");
ctx.use_private_key_file("server.pem", ssl::context::pem);
ctx.use_tmp_dh_file("dh2048.pem");
std::clog << "leave set_ssl_context_callback" << std::endl;
} catch (std::exception const& e) {
std::clog << "ERROR: " << e.what() << "\n";
}
});
listen_config.set_timeout(utility::seconds(10));
http_listener listener(U("https://localhost:10022"),
listen_config); // Server URL, Port .
listener.support(methods::GET, [](http_request req) {
std::clog << "enter handler" << std::endl;
auto j = json::value::object();
auto path = req.request_uri().path();
std::clog << path << std::endl;
j[U("one")] =
json::value::string(U("asdfasefasdfaefasdfasefasdfefasefasefaqf3wfs"
"efasdfasefasdfzsfzdfaesfzsefzsdfzsef"));
req.reply(status_codes::OK, j).wait();
std::clog << "leave handler" << std::endl;
});
listener.open()
.then([&listener] { std::clog << (U("\n start!!\n")); })
.wait(); // Server open
while (true)
;
listener.close(); // huh
}
关于c++ - cpprestsdk https 握手有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62917142/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!