设为首页 加入收藏

TOP

Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用(一)
2019-08-15 00:10:44 】 浏览:127
Tags:Akka-CQRS SSL/TLS for gRPC and HTTPS 签名 证书 产生 使用

  到现在,我们已经完成了POS平台和前端的网络集成。不过,还是那句话:平台系统的网络安全是至关重要的。前一篇博客里我们尝试实现了gRPC ssl/tls网络连接,但测试时用的证书如何产生始终没有搞清楚。现在akka-http开发的ws同样面临HTTPS的设置和使用问题。所以,特别抽出这篇博文讨论一下数字证书的问题。

在正式的生产环境里数字证书应该是由第三方公证机构CA签发的,我们需要向CA提出申请。数字证书的申请、签发和验证流程如下:

1) 服务? S 向第三?方机构CA提交公钥、组织信息、个?信息(域名)等资料提出认证申请 (不需要提供私钥) 2) CA 通过各种手段验证申请者所提供信息的真实性,如组织是否存在、 企业是否合法,是否拥有域名的所有权等 3) 如信息审核通过,CA 会向申请者签发认证文件-证书。 证书包含以下信息:申请者公钥、申请者的组织信息和个?信息、签发机构 CA 信息、有效时间、证书序列号等信息的明?,同时包含一个签名的产?生算法:首先,使用散列函数计算出证书中公开明文信息的信息摘要,然后, 采用 CA 的私钥对信息摘要进?加密,这个密?就是签名了 4) 客户端 C 向服务器 S 发出请求时,S 返回证书文件 5) 客户端 C 读取证书中的相关的明?信息,采?相同的散列函数计算得到信息摘要, 然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法 6) 客户端 C 然后检验证书相关的域名信息、有效时间等信息 7) 客户端 C 应内置信任 CA 的证书信息(包含公钥),如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法 8) 内置 CA 对应的证书称为根证书,颁发者和使?者相同,用 CA ??的私钥签名,即?签名证书(此证书中的公钥即为 CA 的公钥,可以使用这个公钥对证书的签名进行校验,?需另外?份证书)

服务器端在通信中建立SSL加密渠道过程如下:

1)客户端 C 发送请求到服务器端 S 2) 服务器端 S 返回证书和公开密钥到 C,公开密钥作为证书的一部分传送 3)客户端 C 检验证书和公开密钥的有效性,如果有效,则?成共享密钥并使?公开密钥加密发送到服务器端 S 4) 服务器端 S 使?私有密钥解密数据,并用收到的共享密钥加密数据,发送到客户端 C 5) 客户端 C 使?用共享密钥解密数据 6) SSL 加密通信渠道建立 ...

应该说,需要在客户端进行认证的应用场景不多。这种情况需要在客户端存放数字证书。像支付宝和一些银行客户端一般都需要安装证书。

好了,还是回到如何产生自签名证书示范吧。下面是一个标准的用openssl命令产生自签名证书流程:

在产生证书和密钥的过程中所有系统提问回答要一致。我们先假设密码统一为:123456

1、生成根证书私钥: rootCA.key:  openssl genrsa -des3 -out rootCA.key 2048 

2、根证书申请 rootCA.csr:openssl req -new -key rootCA.key -out rootCA.csr

3、用申请rootCA.csr生成根证书 rootCA.crt:openssl x509 -req -days 365 -sha256 -extensions v3_ca -signkey rootCA.key -in rootCA.csr -out rootCA.crt

4、pem根证书 rootCA.pem:openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

5、创建?个v3.ext?件,目的是产生X509 v3证书,主要目的是指定subjectAltName选项:

  authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = localhost IP.1 = "192.168.11.189" IP.5 = "192.168.0.189" IP.2 = "132.232.229.60" IP.3 = "118.24.165.225" IP.4 = "129.28.108.238"

注意subjectAltName,这些都是可以信任的域名或地址。

6、构建证书密钥 server.key:openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key

7、用根证书rootCA产生自签证书 server.crt:openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

上面这个过程需要不断重复回答同样的问题,很烦。可以用配置文件来一次性产生:

先构建一个ssl.cnf文件:

  [req]
  prompt = no
  default_bits = 4096
  default_md = sha256
  distinguished_name = dn
  x509_extensions = v3_req
  [dn]
  C=CN
  ST=GuangDong
  L=ShenZhen
  O=Bayakala
  OU=POS
  CN=www.bayakala.com
  emailAddress=admin@localhost
  [v3_req]
  keyUsage=keyEncipherment, dataEncipherment
  extendedKeyUsage=serverAuth
  subjectAltName=@alt_names
  [alt_names]
  DNS.1 = localhost
  IP.1 = "192.168.11.189"  
  IP.5 = "192.168.0.189"
  IP.2 = "132.232.229.60"
  IP.3 = "118.24.165.225"
  IP.4 = "129.28.108.238"

然后:openssl req -new -newkey rsa:2048 -sha1 -days 3650 -nodes -x509 -keyout server.key -out server.crt -config ssl.cnf

一个指令同时产生需要的server.crt,server.key。

除aubjectAltName外还要关注CN这个字段,它就是我们经常会遇到系统提问:你确定信任“域

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇play framework + sbt入门之环境.. 下一篇Spark家族:Win10系统下搭建Scala..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目