0.介绍

自己开发的使用了SSL协议的软件,通常没必要从证书签发机构那里来获取证书,自签证书成了必要的选择。自签证书还可以用来实现客户端登录认证。

1.创建CA

  1. 创建CA的私钥
  2. openssl genrsa -des3 -out rootCA.key 4096
  3. 创建CA的自签证书
  4. openssl req -x509 -new -nodes -sha256 -days 3650 -key rootCA.key -out rootCA.crt

2.签发证书

  1. 生成证书的私钥
  2. openssl genrsa -out server.key 4096
  3. 生成待签名的文件
  4. openssl req -new -key server.key -out server.csr
  5. 使用CA进行签名
  6. openssl x509 -req -CA rootCA.crt -CAKey rootCA.key -CAcreateserial -days 365 -sha256 -in server.csr -out server.crt

这样就获取了经CA签发的私钥server.key和证书server.crt

3.客户端的登录认证

使用相同的CA来签发服务器证书和客户端证书,服务器就可以根据CA证书来鉴定客户端的是否具有登录权限。

即:凡是经过CA签发的证书,都能登录成功;否则失败  。

4.Python代码示例,演示如何验证客户端的证书

服务端代码:

  1. import socket
  2. from socket import AF_INET, SOCK_STREAM, SO_REUSEADDR, SOL_SOCKET, SHUT_RDWR
  3. import ssl
  4.  
  5. listen_addr = '127.0.0.1'
  6. listen_port = 8082
  7. server_cert = 'server.crt'
  8. server_key = 'server.key'
  9. ca_cert = 'rootCA.crt'
  10.  
  11. context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH, cafile=ca_cert)
  12. context.verify_mode = ssl.CERT_REQUIRED
  13. context.load_cert_chain(certfile=server_cert, keyfile=server_key)
  14. # context.load_verify_locations(cafile=ca_cert)
  15.  
  16. bindsocket = socket.socket()
  17. bindsocket.bind((listen_addr, listen_port))
  18. bindsocket.listen(5)
  19.  
  20. while True:
  21. print("Waiting for client")
  22. newsocket, fromaddr = bindsocket.accept()
  23. print("Client connected: {}:{}".format(fromaddr[0], fromaddr[1]))
  24. conn = context.wrap_socket(newsocket, server_side=True)
  25. print("SSL established. Peer: {}".format(conn.getpeercert()))
  26. buf = b'' # Buffer to hold received client data
  27. try:
  28. while True:
  29. data = conn.recv(4096)
  30. if data:
  31. # Client sent us data. Append to buffer
  32. buf += data
  33. else:
  34. # No more data from client. Show buffer and close connection.
  35. print("Received:", buf)
  36. break
  37. finally:
  38. print("Closing connection")
  39. conn.shutdown(socket.SHUT_RDWR)
  40. conn.close()

客户端代码

  1. import socket
  2. import ssl
  3.  
  4. host_addr = '127.0.0.1'
  5. host_port = 8082
  6. server_sni_hostname = 'example.com'
  7. ca_cert = 'rootCA.crt'
  8. client_cert = 'client.crt'
  9. client_key = 'client.key'
  10.  
  11. context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=ca_cert)
  12. context.check_hostname = False
  13. context.load_cert_chain(certfile=client_cert, keyfile=client_key)
  14.  
  15. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  16. conn = context.wrap_socket(s, server_side=False, server_hostname=server_sni_hostname)
  17. conn.connect((host_addr, host_port))
  18. print("SSL established. Peer: {}".format(conn.getpeercert()))
  19. print("Sending: 'Hello, world!")
  20. conn.send(b"Hello, world!")
  21. print("Closing connection")
  22. conn.close()

  

参考

自签SSL证书的更多相关文章

  1. 使用自签SSL证书有什么风险?

    http://mt.sohu.com/20150602/n414267586.shtml 所谓自签SSL证书,是指不受信任的任意机构或个人,使用工具自己签发的SSL证书.自签名SSL证书可以随意签发, ...

  2. spring boot / cloud (五) 自签SSL证书以及HTTPS

    spring boot / cloud (五) 自签SSL证书以及HTTPS 前言 什么是HTTPS? HTTPS(全称:Hyper Text Transfer Protocol over Secur ...

  3. 部署asp.net core Kestrel 支持https 使用openssl自签ssl证书

    通过openssl生成证书 openssl req -newkey rsa:2048 -nodes -keyout my.key -x509 -days 365 -out my.cer openssl ...

  4. 自签名证书说明——自签名证书的Issuer和Subject是一样的。不安全的原因是:没有得到专业SSL证书颁发的机构的技术支持?比如使用不安全的1024位非对称密钥对,有效期设置很长等

    一般的数字证书产品的主题通常含有如下字段:公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,一般为网站域名:而对于代码签名证书则为申请单位名称:而对于客户端证书则为证书申请者 ...

  5. CA机构及SSL证书

    互联网安全形势日趋严峻,企业重视自身互联网安全已成必然,SSL认证成大势所趋.要部署SSL证书最首先就是选好CA机构!其次选择适合自己的SSL证书!今天就来介绍一下如何选择CA机构及SSL证书! 首先 ...

  6. 为你的Android App实现自签名的 SSL 证书(转)

    介绍 网络安全已成为大家最关心的问题. 如果你利用服务器存储客户资料, 那你应该考虑使用 SSL 加密客户跟服务器之间的通讯. 随着这几年手机应用迅速崛起. 黑客也开始向手机应用转移, 原因有下列3点 ...

  7. Apache环境服务器配置Let's Encrypt免费SSL证书及自动续期方法

    如今越来越多的网站开始使用SSL证书,实现HTTPS网址形式,如果我们是英文网站更需要用到这样格式的HTTPS网址,因为根据谷歌搜索结果提示到如果用到SSL证书的在同等条件下排名结果是有靠前可能的.我 ...

  8. ssl证书验证

    当我们在访问https网站时,浏览器就会自动下载该网站的SSL证书,并对证书的安全性进行检查. 其他概念不说了,有效期之类的验证也不说了.只说数字证书的真实性和可信性验证. 1.CA下发给网站的证书是 ...

  9. Https系列之一:https的简单介绍及SSL证书的生成

    Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...

随机推荐

  1. Scrum模拟微信看一看“疫情专区”的敏捷开发过程

    无论作为产品用户还是管理咨询顾问,都非常非常喜欢微信.自认感情比较克制属于“高冷”挂,但从很多方面都太佩服太崇拜张小龙了(新书里微信也会是最喜欢的案例之一,真的不只是一个产品而已,很多方面都太牛了). ...

  2. pyteeseract使用报错Error: one input ui-file must be specified解决

    Python在图像识别有天然的优势,今天使用pytesseract模块时遇到一个报错:“Error: one input ui-file must be specified”. 环境:windows ...

  3. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path index.jsp页面出现错误的解决方法

    点击项目名称>>>点击Buid Path>>>点击右侧add  library>>>点击Server  Runtime>>>点击 ...

  4. 【技巧】歪脑筋优化flexbox瀑布流布局方案

    效果先行 需求 在大量"不定宽"元素并排的布局模式下,上图是我们想要的最佳布局但是FlexBox布局虽然枪弹但并不能完全呈现以上布局,于是我们需要结合FlexBox作下小的改动即可 ...

  5. 利用canvas绘画二级树形结构图

    上周需要做一个把页面左侧列表内容拖拽到右侧区域,并且绘制成关系树的功能.看了设计图,第一反应是用canvas绘制关系线.吭哧吭哧搞定这个功能后,发现用canvas绘图,有一个很严重的缺陷.那就是如果左 ...

  6. 零基础JavaScript编码(三)总结

    任务目的 在上一任务基础上继续JavaScript的体验 接触一下JavaScript中的高级选择器 学习JavaScript中的数组对象遍历.读写.排序等操作 学习简单的字符串处理操作 任务描述 参 ...

  7. 2020最新ArchLinux安装(KDE桌面)

    许多网友反映之前的教程安装好后连不上互联网,最近我刚好又安装了一遍,总结出以下没毛病的过程 按照此教程需要你会基本的vim操作(或其他文本编辑工具比如nano),基本的fdisk分盘操作(或其他分盘工 ...

  8. python装饰器见解笔记

    def zsq(fun): def zsq_n(*args,**kwargs) print('这是装饰器需要运行内容') r = fun(*args,**kwargs) print('在被装饰函数执行 ...

  9. JavaScript的自调用函数

    函数表达式可以 "自调用". 自调用表达式会自动调用. 如果表达式后面紧跟 () ,则会自动调用. 不能自调用声明的函数. 通过添加括号,来说明它是一个函数表达式: <scr ...

  10. linux ftp服务器设置,只允许用户访问指定的文件夹,禁止访问其他文件夹

    在Linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...