A想要与B通信,A如何向B证明"我就是A",B如何向A证明"我就是B"?证书正是解决这个问题的。
在非对称加密算法中,有一个public key和一个private key,这两个key是一一对应的,通过某一个key加密的数据只能由另一个key解出来。一般private key由用户私有保存,public key是公开的。
证书里包含了以下几项重要信息:
- CommonName(CN):证书对应的人(或物),比如:用户A,用户B
- Public key:CN对应的public key,如果某个用户能解开用这个public key加密的数据,那说明该用户就是该证书对应的人。
- Signature Algorithm: 证书的签名加密算法,比如:sha256WithRSAEncryption。在后面会用到。
- 其他,如:证书的有效时间
这样通过证书把 public key和用户一一对应起来了。但如何证明这个证书是真的?这就是CA(Certificate authority)的作用了。CA是一个颁发证书的权威机构,它自己也有一个public key和private key,它会用private key + 签名算法对上面的证书内容进行加密,生成一个签名,附在证书末尾。例:如果签名算法为sha256WithRSAEncryption时,会先对内容进行sha256处理,再用private key进行加密。用户怎么确认这个证书是经该CA机构认证的证书?他对证书中除签名外的内容进行sha256处理得到内容c1,然后用CA机构公开的public key对签名进行解密得到内容c2,如果c1=c2,则证明该证书确实是该CA机构认证过的。
现在通过CA机构可以将证书与用户一一对应起来了,也就是说A拿着经过CA认证过的证书就可以证明“我确实是A”。但CA认证过的用户就是真实可靠的?这就需要用户对CA机构的认可,将该CA加入信任的证书机构列表里。在chrome浏览器里会内置一些可靠的CA机构,省去了这些操作。
可以通过Openssl生成,参考How to setup your own CA with OpenSSL(非常易懂)。
- Go和HTTPS: https://tonybai.com/2015/04/30/go-and-https/
- TLS with Go: https://ericchiang.github.io/post/go-tls/
-
Kubernetes里用到的证书相关的参数
kubernetes/kubernetes#54665 (comment)
https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts/auth.md
-
How Kubernetes certificate authorities work
https://www.hnwatcher.com/r/5640735/How-Kubernetes-certificate-authorities-work
-
生成kubernetes证书
Certificates: https://kubernetes.io/docs/concepts/cluster-administration/certificates/
Provisioning a CA and Generating TLS Certificates: https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/04-certificate-authority.md
Generating Kubernetes Configuration Files for Authentication: https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/docs/05-kubernetes-configuration-files.md
-
Public-key cryptography: https://en.wikipedia.org/wiki/Public-key_cryptography
-
CA(Certificate authority): https://en.wikipedia.org/wiki/Certificate_authority
-
CSR(Certificate Signing Request)
https://www.sslshopper.com/what-is-a-csr-certificate-signing-request.html
-
PKI(Public key infrastructure)
-
Public key certificate
-
PEM(Privacy-enhanced Electronic Mail)
https://en.wikipedia.org/wiki/Privacy-enhanced_Electronic_Mail
-
TLS(Transport Layer Security)
- Wiki: https://en.wikipedia.org/wiki/Transport_Layer_Security
- RFC5246: https://tools.ietf.org/html/rfc5246
- The First Few Milliseconds of an HTTPS Connection: http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html