知识:Istio-TLS termination && 证书底层知识


mTLS

mTLSMutual TLS(双向TLS认证) 的缩写

让我们使用 curl 演示 mTLS 过程

首先, 我们需要一个 clientserver 都信任的 certificate authority(CA)
CA 就是一个 public keyprivate key
其中 public key 包含在自签名的 X.509证书 中.
使用下面的命令创建 CA

openssl req \
  -new \
  -x509 \
  -nodes \
  -days 365 \
  -subj '/CN=my-ca' \
  -keyout ca.key \
  -out ca.crt

上述命令会产出2个文件: ca.keyca.crt , 使用 PEM格式. 其中

  • ca.keyprivate key(私钥)
  • ca.crtX.509证书 , 其中包含 public key

使用 openssl x509 -in ca.crt -text -noout 查看证书内容
通过查看证书内容,我们可以确认以下几点:

  • SubjectIssuer 都是 CN = my-ca , 这表明该证书是自签名的
  • Validity 表明证书有效期是一年
  • X509v3 Basic Constraints 的值 CA:TRUE 表明该证书可以用做 CA , 即可以用来签署证书
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            [OBMITTED]
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = my-ca
        Validity
            Not Before: Mar  7 00:00:19 2021 GMT
            Not After : Mar  7 00:00:19 2022 GMT
        Subject: CN = my-ca
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    [OBMITTED]
                Exponent: [OBMITTED]
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                [OBMITTED]
            X509v3 Authority Key Identifier: 
                keyid:[OBMITTED]
            
            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         [OBMITTED]

然后,创建Server端的private key和证书
首先创建 server端private key
执行下面的命令, 该命令会产生1个文件: server.key , 即 server端private key

openssl genrsa \
  -out server.key 2048

然后创建 server端证书
(1) 先创建 Certificate Signing Request (CSR) , 下面的命令会产生1个文件: server.csr , 该文件用于第2步生成 server端证书
CN(Common Name) 填写 server的hostname , 本例中为 localhost

# 先创建 CSR
openssl req \
  -new \
  -key server.key \
  -out server.csr

(2) 创建 server端证书 , 下面的命令会产生1个文件: server.crt , 即 server端证书 , 使用 PEM格式

openssl x509 \
  -req \
  -in server.csr \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -days 365 \
  -out server.crt

使用 openssl x509 -in ca.crt -text -noout 查看证书内容
通过查看证书内容,我们可以确认以下几点:

  • IssuerCN = my-ca , 这表明证书是由 my-ca证书颁发机构 签名的
  • SubjectCN = localhost , 这表明可以将该证书提供给客户端,以验证服务器是否可以信任DNS名称localhost的内容
  • Validity 表明证书有效期是一年
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            [OBMITTED]
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = my-ca
        Validity
            Not Before: Jun 13 00:50:18 2020 GMT
            Not After : Jun 13 00:50:18 2021 GMT
        Subject: CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    [OBMITTED]
                Exponent: [OBMITTED]
    Signature Algorithm: sha256WithRSAEncryption
         [OBMITTED]

然后,创建Client端的private key和证书
过程同上

然后,使用curl携带客户端证书访问服务器

curl \
 --cacert ca.crt \
 --key client.key \
 --cert client.crt \
 https://localhost:3000

除了 --cert参数 之外,其他参数还要简单说明一下:

  • --cacert 是为了验证 server端证书
  • --key 是为了发送请求内容时进行私钥加密

TLS Termination

TLS Termination 主要作用是,作为一个 前置代理服务器 接收外部到达的加密TLS流量 , 然后将其 解密为HTTP明文 , 最后再将流量 转发到内部的某个服务

image.png

TLS Origination

TLS Origination 主要作用是 作为一个 代理服务器, 接收内部服务的HTTP明文流量 ,然后将其 加密 ,最后 转发到一个HTTPS服务 上,该服务既可以是内部,也可以是外部的,但看起来就像是一个内部的服务。

image.png

作为与边界入口网关对立的存在,出口网关也通常放置在网络的边界。
所有的出口流量都被它接管,在这个节点上我们可以 统一实施一些访问控制策略 ,或监控,或日志等,这和 Ingress 的功能其实是一样的,最大的不同在于 将明文流量加密再转发

我们对向外主动请求的流量常常是不设防的,这样的严进宽出在安全要求较高的场合是不合适的。
了解了 Egress 这个概念后,不仅仅是在安全上对我们的业务有帮助,对于业务架构的设计其实也是有所裨益的。

考虑一个基于微信的服务,可能会有公众号,小程序,还可能会有多个小程序和公众号,更复杂一些,设计成微服务,不同的服务可能会调用同一公众号的微信接口。
那么问题来了, API access token 的存取就出现了竞争,我们可以做一个独立的服务,将各种token的获取,刷新和缓存封装起来,所有的服务需要用到token时直接通过 token-server 获取即可。
这种办法是可以的,虽然每次微信请求接口调用都产生了一次额外的内部rpc调用,性能上其实可以忽略不计,
麻烦的是代码可能不会简洁,更重要的是 对这些外发接口调用的监控 ,日志没有一个统一的地方处理。
我们还可以做得更好,简单的架构如下:

image.png

在内部服务中,所有调用微信API的协议均使用HTTP,然后这些请求都会经过 wx-egress-server ,它会给请求附加合适的 access token ,通过 HTTPS 协议发往外部的微信服务器。
除此以外,我们还可以 增加日志便于调试 ,监控请求的成功率,甚至发起重试等等,这样相对原来的方案要更灵活。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容