• 罗同学
    2021-11-24
    ca 证书和 tls什么关系呢? 另外为何以前做网站的时候证书都要向运营商购买申请?那个是什么证书

    作者回复: TLS 使用非对称加密(比如 ECDH)来协商出本次 session 的密钥。问题是客户端如何信任服务器提供的公钥就是服务器本人?此时需要有人对服务器的公钥进行签名,为其背书,这个背书着就是 CA。那 CA 又是谁来背书?小 CA 由大 CA 背书,大 CA 再被 Root CA 背书。全世界也就几个十几个 Root CA。这些 Root CA 会被你所使用的操作系统信任。这样,某个服务器的证书就可以被一层层追溯到 Root CA,最终客户端可以信任它。这是 PKI 体系的基础。所有的网站,如果要支持 HTTPS,都需要有一个受信的证书。以前需要购买,现在有了 letsencrypt(背后有 google 的支持),所以可以免费得到受信的证书。 当你把 TLS 直接用在 TCP 之上时,可以自己生成 CA 证书。因为此刻,客户端和服务端都是你自己的代码,你可以在客户端内置信任的 CA 证书,这样就可以不依赖 PKI 体系来在服务器和客户端之间构建安全信道。

    
    12
  • 罗杰
    2021-11-24
    生成证书这块是我比较欠缺的知识,可以好好补充一下了。

    作者回复: 👍

    
    
  • 新新人类
    2022-05-14
    思考题1: 将 ServerConfig 的 ClientCertVerifier 改成 AllowAnyAuthenticatedClient pub fn new(cert: &str, key: &str, client_ca: Option<&str>) -> Result<Self, KvError> { let certs = load_certs(cert)?; let key = load_key(key)?; let mut root_store = match rustls_native_certs::load_native_certs() { Ok(store) | Err((Some(store), _)) => store, Err((None, err)) => { return Err(err.into()); } }; // 如果有签署客户端的 CA 证书,则加载它,这样客户端证书不在根证书链 // 但是这个 CA 证书能验证它,也可以 if let Some(cert) = client_ca { let mut buf = Cursor::new(cert); root_store.add_pem_file(&mut buf).unwrap(); } // 加载 server cert / CA cert,生成 ServerConfig let mut config = ServerConfig::new(AllowAnyAuthenticatedClient::new(root_store)); // 加载服务器证书 config .set_single_cert(certs, key) .map_err(|_| KvError::CertificateParseError("server", "cert"))?; config.set_protocols(&[Vec::from(&ALPN_KV[..])]); Ok(Self { inner: Arc::new(config), }) }
    展开
    
    