基于自签名证书的网络安全应用--在线安全系统页面展示(初级篇)
基于自签名证书的网络安全应用要使用自签名证书实现浏览器与服务端之间的通信本文使用 Python 的 socket 库来创建一个基本的 SSL/TLS 连接。具体实现中需要注意1 无安全加密环境中的HTTP协议可以在服务端业务开启时自行定义端口号 当HTTP 采用SSL/TLS 来建立安全链接时一般是采用默认的443端口2 采用自签名证书时可能会出现证书不可信任提醒以下是一个简单的示例代码演示了如何使用自签名证书进行通信importsocketimportssl# 服务器配置HOSTlocalhost# 服务器主机名或 IP 地址PORT443# 服务器端口号CERT_FILEserver.crt# 服务器证书文件路径KEY_FILEserver.key# 服务器私钥文件路径# 创建 socketserver_socketsocket.socket(socket.AF_INET,socket.SOCK_STREAM)# 绑定服务器地址和端口server_socket.bind((HOST,PORT))# 监听连接server_socket.listen(1)print(等待客户端连接...)# 接受客户端连接client_socket,client_addressserver_socket.accept()print(与客户端建立连接:,client_address)# 加载服务器证书和私钥ssl_contextssl.SSLContext(ssl.PROTOCOL_TLS)ssl_context.load_cert_chain(certfileCERT_FILE,keyfileKEY_FILE)# 创建 SSL/TLS 连接ssl_socketssl_context.wrap_socket(client_socket,server_sideTrue)# 与客户端进行通信whileTrue:datassl_socket.recv(1024)ifnotdata:breakprint(接收到客户端数据:,data.decode())# 进行响应response服务器收到消息: data.decode()ssl_socket.send(response.encode())# 关闭连接ssl_socket.close()server_socket.close()其中HOST: 服务器的主机名或 IP 地址。PORT: 服务器的端口号。CERT_FILE: 服务器的自签名证书文件路径。KEY_FILE: 服务器的私钥文件路径。确保在服务器端正确生成自签名证书并将证书文件和私钥文件的路径指定为参数。在客户端浏览器中手动将自签名证书添加到浏览器的受信任根证书存储中。一、案例应用根据上文的描述我们利用前面文章中介绍的自签名文件生成方法制作了自签名文件具体见博文使用OpenSSL生成自签名证书文件列表如图所示服务端源码import socket serversocket.socket() server.bind((192.168.5.128,8080)) server.listen(5) while True: conn,addrserver.accept() dataconn.recv(1024) print(data) datadata.decode() resdata.split( ) print(res) resres[1] conn.send(bHTTP/1.1 200 ok\r\n\r\n) if res/index: with open(r/mnt/hgfs/share/index1.html,rb) as f: conn.send(f.read()) conn.send(bindex hello) elif res/login: with open(rlogin.html,rb) as f: conn.send(f.read()) conn.send(blogin) conn.send(bhello,no over) else: conn.send(bhello) conn.close()运行该服务端后我们在其他机子上打开浏览器后输入不同的URL可以看到不同的页面展示.但是以上的数据在网络环境中传输是及其不安全的。目前HTTP环境中一个比较好的应用是采用SSL/TLS建立安全链接实现数据的安全通信.基于自签名证书的B/S模式网络安全应用1 修改服务端代码加入SSL/TLS安全模块2 在客户端浏览器中导入自签名证书3 在客户端中导入域名映射根据证书的签名情况二、 修改服务端代码加入SSL/TLS安全模块# HTTPS简易服务端TLSSocket加载自签名证书 import ssl import socket # 1. 创建TLS上下文推荐标准写法替代旧PROTOCOL_TLS context ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) # 加载自签名证书与私钥确保同目录存在 scertificate.crt、sprivate.key context.load_cert_chain(certfilescertificate.crt, keyfilesprivate.key) # 2. 创建原始TCP socket server socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((10.0.1.133, 443)) server.listen(5) print(HTTPS(TLS)服务启动监听 10.0.1.133:443等待客户端连接...) while True: try: # 等待新客户端TCP连接 conn, addr server.accept() print(f新客户端连接{addr}) # 包装为SSL socket执行TLS握手 ssl_s context.wrap_socket(conn, server_sideTrue) # 读取浏览器HTTP请求 data ssl_s.recv(1024) if not data: ssl_s.close() continue print(收到请求原始数据, data) data_str data.decode(utf-8) req_parts data_str.split( ) print(请求拆分, req_parts) req_path req_parts[1] # 构造HTTP响应 response_header bHTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n ssl_s.send(response_header) if req_path /index: with open(r/mnt/hgfs/share/index1.html, rb) as f: ssl_s.send(f.read()) ssl_s.send(bpindex hello/p) elif req_path /login: with open(rlogin.html, rb) as f: ssl_s.send(f.read()) ssl_s.send(bplogin hello,no over/p) else: ssl_s.send(bphello/p) ssl_s.close() except ssl.SSLError as e: print(fTLS握手异常{e}) conn.close() except Exception as e: print(f服务异常{e})三、 把服务器端对应的证书文件导入客户端浏览器中(选做要将自签名证书导入到客户端的受信任根证书存储中按照以下步骤进行操作在 Windows 操作系统上方法一将服务器证书.crt 或 .pem 格式复制到客户端计算机上。双击证书文件以打开证书视图。在证书视图中单击 “安装证书” 按钮。在证书导入向导中选择 “将证书存储到计算机”然后单击 “下一步”。选择 “受信任的根证书颁发机构” 作为证书存储位置然后单击 “下一步”。单击 “浏览”选择 “受信任的根证书颁发机构” 存储位置然后单击 “确定”。单击 “下一步” 完成证书导入过程。在安全警告对话框中确认要导入证书然后单击 “是”。在 Windows 操作系统上方法二将服务器证书.crt 或 .pem 格式复制到客户端计算机上如c:\。使用管理员身份打开win中的cmd运行命令certutil -addstore root c:\scertificate.crt其中(c:\scertificate.crt 是签名文件所在的绝对路径根据实际文件所在的情况输入)设置hosts文件添加映射寻找hosts文件所在路径-使用cd进入hosts的路径下-执行notepad hosts在文件末尾添加服务器的ip与域名的映射图1 寻找hosts文件所在路径图2 进入hosts文件的当前路径图3 使用notepad编辑hosts文件打开hosts文件后在文件的末尾添加一条 web 服务器所在IP地址和证书中虚拟主机的映射解决证书中使用的服务器名称与 IP的映射因为是内部环境没有dns转换所以需要用到hosts文件进行域名重定向如 socket 服务所在的主机为192.168.0.108 证书中的cn为cuc.xjx.com 修改后重启电脑则添加的记录为在 Linux ubuntu操作系统上将服务器证书.crt 或 .pem 格式复制到客户端计算机上。打开终端并使用管理员权限执行以下命令cd 切换到服务器证书文件所在的路径下sudo cp scertificate.crt /usr/local/share/ca-certificates/ #scertificate.crt 也可以使用绝对路径将服务器证书复制到 /usr/local/share/ca-certificates/,该目录存放浏览器所连接的各服务器证书 4. 执行以下命令更新证书存储sudo update-ca-certificates5. 更新完成后服务器证书将被添加到系统的受信任根证书存储中。 由于证书对应的服务器域名未在客户端设置的DNS中发布因此在浏览器输入URLxjx.cuc.com时需要客户端自行转换为IP。所以需要在 Ubuntu 上添加主机映射修改 hosts 文件步骤 1. 打开终端在 Ubuntu 上打开终端。 2. 切换到超级用户运行以下命令以切换到超级用户root模式sudo su3. 编辑 hosts 文件运行以下命令来编辑 hosts 文件nano /etc/hosts4. 在 hosts 文件中添加映射在打开的 hosts 文件中在文件的末尾或适当的位置按照以下格式添加主机映射IP 地址 域名例如如果要将 example.com 映射到 IP 地址 192.168.0.100则可以添加以下行192.168.0.100 example.com5. 保存和退出按下Ctrl X键然后输入Y以保存对 hosts 文件的更改。然后按Enter键退出编辑器。刷新 DNS 缓存可选如果已经访问过这些域名则可能需要刷新 DNS 缓存以使新的主机映射生效。刷新 DNS 缓存sudo systemctl restart systemd-resolved测试在启动服务端的前提下打开浏览器进行测试.(URL中的域名必须和证书制作时输入的-subj 中申明的参数一直