基于自签名证书的网络安全应用--在线安全系统页面展示(低级篇) ...

打印 上一主题 下一主题

主题 1011|帖子 1011|积分 3033

基于自签名证书的网络安全应用

要使用自签名证书实现浏览器与服务端之间的通讯,本文使用 Python 的 socket 库来创建一个基本的 SSL/TLS 连接。详细实现中需要注意:
1 无安全加密环境中的HTTP协议可以在服务端业务开启时自行定义端口号, 当HTTP 采用SSL/TLS 来创建安全链接时,一样平常是采用默认的443端口;
2 采用自签名证书时,大概会出现证书不可信任提醒
以下是一个简朴的示例代码,演示了如何使用自签名证书进行通讯:
  1. import socket
  2. import ssl
  3. # 服务器配置
  4. HOST = 'localhost'  # 服务器主机名或 IP 地址
  5. PORT = 443  # 服务器端口号
  6. CERT_FILE = 'server.crt'  # 服务器证书文件路径
  7. KEY_FILE = 'server.key'  # 服务器私钥文件路径
  8. # 创建 socket
  9. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. # 绑定服务器地址和端口
  11. server_socket.bind((HOST, PORT))
  12. # 监听连接
  13. server_socket.listen(1)
  14. print('等待客户端连接...')
  15. # 接受客户端连接
  16. client_socket, client_address = server_socket.accept()
  17. print('与客户端建立连接:', client_address)
  18. # 加载服务器证书和私钥
  19. ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
  20. ssl_context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)
  21. # 创建 SSL/TLS 连接
  22. ssl_socket = ssl_context.wrap_socket(client_socket, server_side=True)
  23. # 与客户端进行通信
  24. while True:
  25.     data = ssl_socket.recv(1024)
  26.     if not data:
  27.         break
  28.     print('接收到客户端数据:', data.decode())
  29.     # 进行响应
  30.     response = '服务器收到消息: ' + data.decode()
  31.     ssl_socket.send(response.encode())
  32. # 关闭连接
  33. ssl_socket.close()
  34. server_socket.close()
复制代码
其中


  • HOST: 服务器的主机名或 IP 地址。
  • PORT: 服务器的端口号。
  • CERT_FILE: 服务器的自签名证书文件路径。
  • KEY_FILE: 服务器的私钥文件路径。
确保在服务器端正确天生自签名证书,并将证书文件和私钥文件的路径指定为参数。在客户端浏览器中,手动将自签名证书添加到浏览器的受信任根证书存储中。
一、案例应用

根据上文的形貌,我们使用前面文章中介绍的自签名文件天生方法制作了自签名文件,详细见博文:使用OpenSSL天生自签名证书
文件列表如图所示:

服务端源码:
  1. import socket
  2. server=socket.socket()
  3. server.bind(('192.168.5.128',8080))
  4. server.listen(5)
  5. while True:
  6.     conn,addr=server.accept()
  7.     data=conn.recv(1024)
  8.     print(data)
  9.     data=data.decode()
  10.     res=data.split(' ')
  11.     print(res)
  12.     res=res[1]
  13.     conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
  14.     if res=='/index':
  15.         with open(r'/mnt/hgfs/share/index1.html','rb') as f:
  16.             conn.send(f.read())
  17.         conn.send(b'index hello')
  18.     elif res=='/login':
  19.         with open(r'login.html','rb') as f:
  20.             conn.send(f.read())
  21.         conn.send(b'login')
  22.         conn.send(b'hello,no over')
  23.     else:
  24.         conn.send(b'hello')
  25.     conn.close()
复制代码
运行该服务端后,我们在其他机子上打开浏览器后输入不同的URL可以看到不同的页面展示.
但是以上的数据在网络环境中传输是及其不安全的。现在HTTP环境中一个比较好的应用是采用SSL/TLS创建安全链接,实现数据的安全通讯.
基于自签名证书的B/S模式网络安全应用
1 修改服务端代码,加入SSL/TLS安全模块
2 在客户端浏览器中导入自签名证书
3 在客户端中导入域名映射(根据证书的签名情况)
二、 修改服务端代码,加入SSL/TLS安全模块

  1. # from ZMQ@cuc
  2. # date 9/14/23
  3. import ssl
  4. context = ssl.SSLContext(ssl.PROTOCOL_TLS)  #建立上下文对象
  5. context.load_cert_chain(certfile="scertificate.crt", keyfile="sprivate.key")      #关联安全证书
  6. import socket
  7. server=socket.socket()
  8. server.bind(('192.168.5.128',443))   # 注意端口是443
  9. server.listen(5)
  10. conn,addr=server.accept()
  11. ssl_s=context.wrap_socket(conn,server_side=True)
  12. while True:
  13.     data=ssl_s.recv(1024)
  14.     print(data)
  15.     data=data.decode()
  16.     res=data.split(' ')
  17.     print(res)
  18.     res=res[1]
  19.     ssl_s.send(b'HTTP/1.1 200 ok\r\n\r\n')
  20.     if res=='/index':
  21.         with open(r'/mnt/hgfs/share/index1.html','rb') as f:
  22.             ssl_s.send(f.read())
  23.         ssl_s.send(b'index hello')
  24.     elif res=='/login':
  25.         with open(r'login.html','rb') as f:
  26.             ssl_s.send(f.read())
  27.         ssl_s.send(b'login')
  28.         ssl_s.send(b'hello,no over')
  29.     else:
  30.         ssl_s.send(b'hello')
  31.     ssl_s.close()
复制代码
三、 把服务器端对应的证书文件导入客户端浏览器中

要将自签名证书导入到客户端的受信任根证书存储中,按照以下步骤进行操作:
在 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 格式)复制到客户端盘算机上。
  • 打开终端,并使用管理员权限执行以下下令:
  1. cd  切换到服务器证书文件所在的路径下
复制代码
sudo cp scertificate.crt /usr/local/share/ca-certificates/ #scertificate.crt 也可以使用绝对路径
  1. 将服务器证书复制到 `/usr/local/share/ca-certificates/`,该目录存放浏览器所连接的各服务器证书
  2. 4. 执行以下命令更新证书存储:
复制代码
sudo update-ca-certificates
  1. 5. 更新完成后,服务器证书将被添加到系统的受信任根证书存储中。
  2. 由于证书对应的服务器域名未在客户端设置的DNS中发布,因此在浏览器输入URL:xjx.cuc.com时需要客户端自行转换为IP。所以需要在 Ubuntu 上添加主机映射,修改 hosts 文件步骤:
  3. 1. 打开终端:在 Ubuntu 上,打开终端。
  4. 2. 切换到超级用户:运行以下命令以切换到超级用户(root)模式:
复制代码
sudo su
  1. 3. 编辑 hosts 文件:运行以下命令来编辑 hosts 文件:
复制代码
nano /etc/hosts
  1. 4. 在 hosts 文件中添加映射:在打开的 hosts 文件中,在文件的末尾或适当的位置,按照以下格式添加主机映射:
复制代码
<IP 地址> <域名>
  1. 例如,如果要将 `example.com` 映射到 IP 地址 `192.168.0.100`,则可以添加以下行:
复制代码
192.168.0.100 example.com
5. 生存和退出:按下 Ctrl + X 键,然后输入 Y 以生存对 hosts 文件的更改。然后按 Enter 键退出编辑器。

  • 刷新 DNS 缓存(可选):如果已经访问过这些域名,则大概需要刷新 DNS 缓存以使新的主机映射收效。刷新 DNS 缓存:
    1. sudo systemctl restart systemd-resolved
    复制代码
    测试

    在启动服务端的前提下,打开浏览器进行测试.(URL中的域名必须和证书制作时输入的-subj 中说明的参数一直)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表