自己成为一个证书颁发机构(CA)
传输层安全(TLS)模型(有时也称它的旧名称 SSL)基于证书颁发机构certificate authoritie(CA)的概念。这些机构受到浏览器和操作系统的信任,从而签名服务器的的证书以用于验证其所有权。
但是,对于内部网络,微服务架构或集成测试,有时候本地 CA更有用:一个只在内部受信任的 CA,然后签名本地服务器的证书。
这对集成测试特别有意义。获取证书可能会带来负担,因为这会占用服务器几分钟。但是在代码中使用 忽略证书 可能会被引入到生产环境,从而导致安全灾难。
CA 证书与常规服务器证书没有太大区别。重要的是它被本地代码信任。例如,在 Python requests 库中,可以通过将 REQUESTS_CA_BUNDLE 变量设置为包含此证书的目录来完成。
在为集成测试创建证书的例子中,不需要长期的证书:如果你的集成测试需要超过一天,那么你应该已经测试失败了。
因此,计算昨天和明天作为有效期间隔:
import datetime one_day = datetime.timedelta(days=1) today = datetime.date.today() yesterday = today - one_day tomorrow = today - one_day
现在你已准备好创建一个简单的 CA 证书。你需要生成私钥,创建公钥,设置 CA 的 参数 ,然后自签名证书:CA 证书总是自签名的。最后,导出证书文件以及私钥文件。
from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives import hashes, serialization from cryptography import x509 from cryptography.x509.oid import NameOID
builder = builder.subject_name(x509.Name([ x509.NameAttribute(NameOID.COMMON_NAME, Simple Test CA), builder = builder.issuer_name(x509.Name([ x509.NameAttribute(NameOID.COMMON_NAME, Simple Test CA), builder = builder.not_valid_before(yesterday) builder = builder.not_valid_after(tomorrow) builder = builder.serial_number(x509.random_serial_number()) builder = builder.public_key(public_key) builder = builder.add_extension( x509.BasicConstraints(ca=True, path_length=None), critical=True) certificate = builder.sign( private_key=private_key, algorithm=hashes.SHA256(), backend=default_backend() private_bytes = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncrption()) public_bytes = certificate.public_bytes( encoding=serialization.Encoding.PEM) with open("ca.pem", "wb") as fout: fout.write(private_bytes + public_bytes) with open("ca.crt", "wb") as fout: fout.write(public_bytes)
通常,真正的 CA 会需要证书签名请求(CSR)来签名证书。但是,当你是自己的 CA 时,你可以制定自己的规则!可以径直签名你想要的内容。
继续集成测试的例子,你可以创建私钥并立即签名相应的公钥。注意 COMMON_NAME 需要是 https URL 中的 服务器名称 。如果你已配置名称查询,你需要服务器能响应对 service.test.local 的请求。
service_private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() service_public_key = service_private_key.public_key() builder = x509.CertificateBuilder() builder = builder.subject_name(x509.Name([ x509.NameAttribute(NameOID.COMMON_NAME, service.test.local) builder = builder.not_valid_before(yesterday) builder = builder.not_valid_after(tomorrow) builder = builder.public_key(public_key) certificate = builder.sign( private_key=private_key, algorithm=hashes.SHA256(), backend=default_backend() private_bytes = service_private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncrption()) public_bytes = certificate.public_bytes( encoding=serialization.Encoding.PEM) with open("service.pem", "wb") as fout: fout.write(private_bytes + public_bytes)
现在 service.pem 文件有一个私钥和一个 有效 的证书:它已由本地的 CA 签名。该文件的格式可以给 Nginx、HAProxy 或大多数其他 HTTPS 服务器使用。
通过将此逻辑用在测试脚本中,只要客户端配置信任该 CA,那么就可以轻松创建看起来真实的 HTTPS 服务器。
via: https://opensource.com/article/19/4/certificate-authority
作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/48148.html
Haproxylinuxnginxpython微服务相关文章
- ubuntu 18.04 安装 opencv(踩了很多雷终于整合成一个完整的成功版本)[通俗易懂]
- 2022-09-27:给定一个棵树, 树上每个节点都有自己的值,记录在数组nums里, 比如nums[4] = 10,表示4号点的值是10, 给定树上的每一条边
- 没有一个顺手的流程绘制工具?好吧,自己动手,丰衣足食!
- 推荐一个免费短链接平台-星泽V社
- 从零到一搭建一个属于自己的博客系统(弎)「建议收藏」
- 如何用html+css+js做一个跳跃逃离坍塌房子
- 性能测试技术笔记(三):如何设计一个压测平台
- 千丈之堤,以蝼蚁之穴溃:一个慢SQL引发的雪崩
- 【你又有一个好消息】荣获2022年国民技术MCU&RT-Thread设计大赛获奖榜单头名
- 隧道代理阿布云、亿牛云、熊猫代理好用吗?自己要怎么做一个隧道代理?
- 2023-01-11:体育馆的人流量。编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。返回按 visit_date
- 如何自己搞一个维基百科?
- Uni开发的app,使用Windows S10,放在ios上,全程跟着一个马平川。
- 自己动手实现一个 Java Class 解析器详解编程语言
- 自己写一个java.lang.reflect.Proxy代理的实现详解编程语言
- SQL Server中的冒号:一个普遍使用的特殊标点符号(sqlserver中冒号)
- Linux系统报警:把安全性提高到另一个水平(alarm linux)
- C与MySQL结合一个简单的示例(c# mysql 例子)
- VS控制台操作Redis一个非常简单的新手指南(vs控制redis)
- 黑客特种兵潘少华:如何用人工智能“套路”一个骗子 | 雷锋网公开课
- 一个仿DOS的Loading效果
- PHP下一个非常全面获取图象信息的函数
- 使用jqueryprev()方法找到同级的前一个元素
- 推荐一个自己用的封装好的javascript插件