自签SSL证书
0.介绍
自己开发的使用了SSL协议的软件,通常没必要从证书签发机构那里来获取证书,自签证书成了必要的选择。自签证书还可以用来实现客户端登录认证。
1.创建CA
- 创建CA的私钥
- openssl genrsa -des3 -out rootCA.key 4096
- 创建CA的自签证书
- openssl req -x509 -new -nodes -sha256 -days 3650 -key rootCA.key -out rootCA.crt
2.签发证书
- 生成证书的私钥
- openssl genrsa -out server.key 4096
- 生成待签名的文件
- openssl req -new -key server.key -out server.csr
- 使用CA进行签名
- 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代码示例,演示如何验证客户端的证书
服务端代码:
- import socket
- from socket import AF_INET, SOCK_STREAM, SO_REUSEADDR, SOL_SOCKET, SHUT_RDWR
- import ssl
- listen_addr = '127.0.0.1'
- listen_port = 8082
- server_cert = 'server.crt'
- server_key = 'server.key'
- ca_cert = 'rootCA.crt'
- context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH, cafile=ca_cert)
- context.verify_mode = ssl.CERT_REQUIRED
- context.load_cert_chain(certfile=server_cert, keyfile=server_key)
- # context.load_verify_locations(cafile=ca_cert)
- bindsocket = socket.socket()
- bindsocket.bind((listen_addr, listen_port))
- bindsocket.listen(5)
- while True:
- print("Waiting for client")
- newsocket, fromaddr = bindsocket.accept()
- print("Client connected: {}:{}".format(fromaddr[0], fromaddr[1]))
- conn = context.wrap_socket(newsocket, server_side=True)
- print("SSL established. Peer: {}".format(conn.getpeercert()))
- buf = b'' # Buffer to hold received client data
- try:
- while True:
- data = conn.recv(4096)
- if data:
- # Client sent us data. Append to buffer
- buf += data
- else:
- # No more data from client. Show buffer and close connection.
- print("Received:", buf)
- break
- finally:
- print("Closing connection")
- conn.shutdown(socket.SHUT_RDWR)
- conn.close()
客户端代码
- import socket
- import ssl
- host_addr = '127.0.0.1'
- host_port = 8082
- server_sni_hostname = 'example.com'
- ca_cert = 'rootCA.crt'
- client_cert = 'client.crt'
- client_key = 'client.key'
- context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=ca_cert)
- context.check_hostname = False
- context.load_cert_chain(certfile=client_cert, keyfile=client_key)
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- conn = context.wrap_socket(s, server_side=False, server_hostname=server_sni_hostname)
- conn.connect((host_addr, host_port))
- print("SSL established. Peer: {}".format(conn.getpeercert()))
- print("Sending: 'Hello, world!")
- conn.send(b"Hello, world!")
- print("Closing connection")
- conn.close()
参考
- 创建证书https://gist.github.com/fntlnz/cf14feb5a46b2eda428e000157447309
- Python的SSL代码https://www.electricmonk.nl/log/2018/06/02/ssl-tls-client-certificate-verification-with-python-v3-4-sslcontext/
自签SSL证书的更多相关文章
- 使用自签SSL证书有什么风险?
http://mt.sohu.com/20150602/n414267586.shtml 所谓自签SSL证书,是指不受信任的任意机构或个人,使用工具自己签发的SSL证书.自签名SSL证书可以随意签发, ...
- spring boot / cloud (五) 自签SSL证书以及HTTPS
spring boot / cloud (五) 自签SSL证书以及HTTPS 前言 什么是HTTPS? HTTPS(全称:Hyper Text Transfer Protocol over Secur ...
- 部署asp.net core Kestrel 支持https 使用openssl自签ssl证书
通过openssl生成证书 openssl req -newkey rsa:2048 -nodes -keyout my.key -x509 -days 365 -out my.cer openssl ...
- 自签名证书说明——自签名证书的Issuer和Subject是一样的。不安全的原因是:没有得到专业SSL证书颁发的机构的技术支持?比如使用不安全的1024位非对称密钥对,有效期设置很长等
一般的数字证书产品的主题通常含有如下字段:公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,一般为网站域名:而对于代码签名证书则为申请单位名称:而对于客户端证书则为证书申请者 ...
- CA机构及SSL证书
互联网安全形势日趋严峻,企业重视自身互联网安全已成必然,SSL认证成大势所趋.要部署SSL证书最首先就是选好CA机构!其次选择适合自己的SSL证书!今天就来介绍一下如何选择CA机构及SSL证书! 首先 ...
- 为你的Android App实现自签名的 SSL 证书(转)
介绍 网络安全已成为大家最关心的问题. 如果你利用服务器存储客户资料, 那你应该考虑使用 SSL 加密客户跟服务器之间的通讯. 随着这几年手机应用迅速崛起. 黑客也开始向手机应用转移, 原因有下列3点 ...
- Apache环境服务器配置Let's Encrypt免费SSL证书及自动续期方法
如今越来越多的网站开始使用SSL证书,实现HTTPS网址形式,如果我们是英文网站更需要用到这样格式的HTTPS网址,因为根据谷歌搜索结果提示到如果用到SSL证书的在同等条件下排名结果是有靠前可能的.我 ...
- ssl证书验证
当我们在访问https网站时,浏览器就会自动下载该网站的SSL证书,并对证书的安全性进行检查. 其他概念不说了,有效期之类的验证也不说了.只说数字证书的真实性和可信性验证. 1.CA下发给网站的证书是 ...
- Https系列之一:https的简单介绍及SSL证书的生成
Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...
随机推荐
- Scrum模拟微信看一看“疫情专区”的敏捷开发过程
无论作为产品用户还是管理咨询顾问,都非常非常喜欢微信.自认感情比较克制属于“高冷”挂,但从很多方面都太佩服太崇拜张小龙了(新书里微信也会是最喜欢的案例之一,真的不只是一个产品而已,很多方面都太牛了). ...
- pyteeseract使用报错Error: one input ui-file must be specified解决
Python在图像识别有天然的优势,今天使用pytesseract模块时遇到一个报错:“Error: one input ui-file must be specified”. 环境:windows ...
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path index.jsp页面出现错误的解决方法
点击项目名称>>>点击Buid Path>>>点击右侧add library>>>点击Server Runtime>>>点击 ...
- 【技巧】歪脑筋优化flexbox瀑布流布局方案
效果先行 需求 在大量"不定宽"元素并排的布局模式下,上图是我们想要的最佳布局但是FlexBox布局虽然枪弹但并不能完全呈现以上布局,于是我们需要结合FlexBox作下小的改动即可 ...
- 利用canvas绘画二级树形结构图
上周需要做一个把页面左侧列表内容拖拽到右侧区域,并且绘制成关系树的功能.看了设计图,第一反应是用canvas绘制关系线.吭哧吭哧搞定这个功能后,发现用canvas绘图,有一个很严重的缺陷.那就是如果左 ...
- 零基础JavaScript编码(三)总结
任务目的 在上一任务基础上继续JavaScript的体验 接触一下JavaScript中的高级选择器 学习JavaScript中的数组对象遍历.读写.排序等操作 学习简单的字符串处理操作 任务描述 参 ...
- 2020最新ArchLinux安装(KDE桌面)
许多网友反映之前的教程安装好后连不上互联网,最近我刚好又安装了一遍,总结出以下没毛病的过程 按照此教程需要你会基本的vim操作(或其他文本编辑工具比如nano),基本的fdisk分盘操作(或其他分盘工 ...
- python装饰器见解笔记
def zsq(fun): def zsq_n(*args,**kwargs) print('这是装饰器需要运行内容') r = fun(*args,**kwargs) print('在被装饰函数执行 ...
- JavaScript的自调用函数
函数表达式可以 "自调用". 自调用表达式会自动调用. 如果表达式后面紧跟 () ,则会自动调用. 不能自调用声明的函数. 通过添加括号,来说明它是一个函数表达式: <scr ...
- linux ftp服务器设置,只允许用户访问指定的文件夹,禁止访问其他文件夹
在Linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...