自签SSL证书实现客户端登录认证

更新日期: 2020-02-03阅读: 1.6k标签: 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://www.fly63.com/article/detial/8507

为二级域名注册ssl证书,并强制使用https对http进行跳转

服务器上仍然使用nginx进行代理:1.为二级域名申请ssl证书。2.在域名解析服务中,为二级域名添加解析记录。3.nginx默认读取/etc/nginx/conf.d/*.conf。在conf.d下建立二级域名对应的配置文件如vi blog.conf

https证书申请是如何收费的?

SSL证书成为了当今网络安全的核心要素,所以安装SSL证书成为了不少人的选择。那么https证书申请费用是多少呢?下面就来说说。

SSL证书对SEO网站优有什么影响?使用HTTPS的SEO优势

根据您是网站的用户还是开发自己的网站,良好的在线体验将涉及安全的第三方和可信加密。为了理解如何完成这项工作并更好地理解为什么百度会支持某些元素

为什么网站安装SSL证书如此重要?

在过去,大多数公司只有在敏感信息需要在网站之间传输时,才使用SSL证书。例如,当×××输入用户名和密码来登录他们的账户时,或者当购物者在商业站点上输入信用卡信息时,使用SSL证书是非常常见的

Azure 免费送网站SSL证书啦!

微软推出了 App Service Managed Certificates 预览版。简单来说,这就是在 Azure App Service 服务的一项更新,免费送你SSL证书! 只要点几下鼠标就能给网站加上SSL证书!并且到期自动续命! 屌丝再也不需要996捣鼓

ssl证书的作用,做网站是否必须安装?

您的网站安全吗?在黑客攻击频频发生的这个互联网时代,很多运营者都在纠结是否要安装SSL证书来提高网站的安全性,今天我们就来聊聊网站是否一定要安装SSL证书。

网站安全锁-SSL证书

了安全起见,现在开发微信服务号和IOS客户端等访问服务器端都要求使用https加密传输。SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!