1. mbedTLS源码:
科普:https://www.cnblogs.com/kerwincui/p/14179837.html
源码及framework的链接,下载framework后,放在mbedTLS的framework目录下:
https://github.com/Mbed-TLS/mbedtls
https://github.com/Mbed-TLS/mbedtls-framework/tree/94599c0e3b5036e086446a51a3f79640f70f22f6
1.1 编译上述源码
按照官方的步骤来即可。
$ mkdir build
$ cmake ..
$ 编译生成动态库:cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On ..
$ make -j4
$ ...
2. 生成步骤:
2.1. 生成 CA 根密钥和根证书
//生成 CA 根密钥 (ca_key.pem)
./programs/pkey/gen_key type=rsa rsa_keysize=4096 filename=ca_key.pem
//生成 CA 根证书 (ca_cert.pem)
./programs/x509/cert_write selfsign=1 issuer_key=ca_key.pem issue_name="CN=My Root CA,O=My Organization,C=US" not_before=20240101000000 not_after=20350101000000 output_file=ca_cert.pem
注意: 在生成根证书时,`subject_name` 参数定义了 CA 的信息。
2.2 生成服务器密钥和证书签名请求 (CSR)
//生成服务器私钥 (server_key.pem)
./programs/pkey/gen_key type=rsa rsa_keysize=4096 filename=server_key.pem
//生成服务器证书签名请求 (server.csr)
./programs/x509/cert_req filename=server_key.pem output_file=server.csr subject_name="CN=server,O=My Organization,C=US"
2.3. 签署服务器证书
//生成服务器证书 (server_cert.pem)
./programs/x509/cert_write issuer_key=ca_key.pem issuer_name="CN=My Root CA,O=My Organization,C=US" request_file=server.csr subject_name="CN=server,O=My Organization,C=US" output_file=server_cert.pem not_before=20240101000000 not_after=20250101000000
注意: 在生成服务器证书时,确保 `issuer_name` 与 CA 证书的 `subject_name` 一致,同时 `subject_name` 应该与 CSR 中的名称一致。
2.4. 生成客户端私钥和证书签名请求 (CSR)
//生成客户端私钥 (client_key.pem)
./programs/pkey/gen_key type=rsa rsa_keysize=4096 filename=client_key.pem
//生成客户端证书签名请求(client_csr.pem)
./programs/x509/cert_req filename=client_key.pem output_file=client_csr.pem subject_name="CN=client,O=My Organization,C=US"
2.5. 签署客户端证书
//生成客户端证书 (client_cert.pem)
./programs/x509/cert_write issuer_key=ca_key.pem issuer_name="CN=My Root CA,O=My Organization,C=US" request_file=client_csr.pem subject_name="CN=client,O=My Organization,C=US" output_file=client_cert.pem not_before=20240101000000 not_after=20250101000000
注意: 同样,确保 `issuer_name` 与 CA 证书的 `subject_name` 一致,`subject_name` 与 CSR 中的名称一致。
2.6. 验证生成的证书
//验证服务器证书
./programs/x509/cert_app mode=file filename=server_cert.pem ca_file=ca_cert.pem
//验证客户端证书
./programs/x509/cert_app mode=file filename=client_cert.pem ca_file=ca_cert.pem
验证可以通过。
3.提示
1. 保持 `issuer_name` 和 `subject_name` 的一致性:
- 在签署服务器和客户端证书时,`issuer_name` 应该与 CA 的 `subject_name` 一致。
- 生成的证书的 `subject_name` 应与其对应的 CSR 的 `subject_name` 一致。
2. 确保时间格式正确:
- `not_before` 和 `not_after` 的时间格式是 `YYYYMMDDHHMMSS`,确保时间段在当前时间范围内。
3. CA 根证书的 `selfsign` 参数:
- 生成CA根证书的餐胡应该是issue_name和生成服务器 / 客户端的issue_name保持一致
- 在生成 CA 根证书时,`selfsign=1` 是必需的,这标志着它是自签名证书。
4. 检查文件内容:
- 确保所有生成的文件(密钥、CSR、证书)内容正确且完整。
5. 路径和权限:
- 确保命令中使用的路径正确,且有足够的权限访问这些文件。
4. 配合nng协议使用mbedTLS
在nng协议的CMakeLists.txt中添加:
set(NNG_ENABLE_TLS "Enable TLS support in NNG" ON)
set(BUILD_SHARED_LIBS "Build shared libraries" ON)
在mbedTLS的CMakeLists.txt中添加:
option(USE_SHARED_MBEDTLS_LIBRARY "Use shared mbedTLS library" ON )
我加在66行
nng协议集成了TLS接口,可以和mbedTLS 配合实现传输层安全。下面给出demo:
4.1 根据上面的步骤生成证书和秘钥
进入到mbedTLS的编译路径的build目录(这里创建了一个新的目录来保存生成的文件,所以下面的命令是 ../):
#!/bin/bash
echo "#生成 CA 根密钥 (ca_key.pem)..."
../programs/pkey/gen_key type=rsa rsa_keysize=4096 filename=ca_key.pem
echo "#生成 CA 根证书 (ca_cert.pem)..."
../programs/x509/cert_write selfsign=1 issuer_key=ca_key.pem issuer_name="CN=My Root CA,O=My Organization,C=US" not_before=20240101000000 not_after=20350101000000 is_ca=1 output_file=ca_cert.pem
echo "#生成服务器私钥 (server_key.pem)..."
../programs/pkey/gen_key type=rsa rsa_keysize=4096 filename=server_key.pem
echo "#生成服务器证书签名请求 (server.csr)..."
../programs/x509/cert_req filename=server_key.pem output_file=server.csr subject_name="CN=server,O=My Organization,C=US"
echo "#生成服务器证书 (server_cert.pem)..."
../programs/x509/cert_write issuer_key=ca_key.pem issuer_name="CN=My Root CA,O=My Organization,C=US" request_file=server.csr subject_name="CN=server,O=My Organization,C=US" output_file=server_cert.pem not_before=20240101000000 not_after=20250101000000
echo "#生成客户端私钥 (client_key.pem)..."
../programs/pkey/gen_key type=rsa rsa_keysize=4096 filename=client_key.pem
echo "#生成客户端证书签名请求(client_csr.pem)..."
../programs/x509/cert_req filename=client_key.pem output_file=client_csr.pem subject_name="CN=client,O=My Organization,C=US"
echo "#生成客户端证书 (client_cert.pem)..."
../programs/x509/cert_write issuer_key=ca_key.pem issuer_name="CN=My Root CA,O=My Organization,C=US" request_file=client_csr.pem subject_name="CN=client,O=My Organization,C=US" output_file=client_cert.pem not_before=20240101000000 not_after=20250101000000
echo "#验证服务器证书..."
../programs/x509/cert_app mode=file filename=serve_cert.pem ca_file=ca_cert.pem
echo "#验证客户端证书..."
../programs/x509/cert_app mode=file filename=client_cert.pem ca_file=ca_cert.pem
cat server_key.pem >> server_cert.pem
然后在代码里加载server端证书的时候,指定文件名 server_cert.pem
cat client_key.pem >>client_cert.pem