mbedTLS生成客户端,服务端密钥及CA证书

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

5. nng协议使用TLS

以下是示例代码,演示如何使用Python实现基于TLS的SYSLOG客户端服务端: ## 1. 服务端代码 ```python import socket import ssl # 定义服务器地址和端口号 HOST = '127.0.0.1' PORT = 6514 # 创建TCP套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定服务器地址和端口号 server_socket.bind((HOST, PORT)) # 监听客户端连接 server_socket.listen(1) # 加载证书密钥 context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain(certfile='server.crt', keyfile='server.key') # 等待客户端连接 print('Waiting for client connection...') conn, addr = server_socket.accept() # 将TCP套接字包装成SSL套接字 ssl_conn = context.wrap_socket(conn, server_side=True) # 接收客户端发送的数据 while True: data = ssl_conn.recv(1024) if not data: break print(data.decode('utf-8')) # 关闭SSL套接字和TCP套接字 ssl_conn.close() server_socket.close() ``` ## 2. 客户端代码 ```python import socket import ssl import time # 定义服务器地址和端口号 HOST = '127.0.0.1' PORT = 6514 # 创建TCP套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将TCP套接字包装成SSL套接字 context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.verify_mode = ssl.CERT_NONE ssl_conn = context.wrap_socket(client_socket) # 连接服务器 ssl_conn.connect((HOST, PORT)) # 发送数据 while True: message = 'Hello, world! ' + time.ctime() ssl_conn.sendall(message.encode('utf-8')) time.sleep(1) # 关闭SSL套接字和TCP套接字 ssl_conn.close() client_socket.close() ``` 注意:以上示例代码仅供参考,实际使用时需要根据具体情况进行修改。同时,还需要在运行之前生成证书密钥,以保证通信的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值