最近做了一个微信小程序。上线后发现苹果能正常访问服务器,但安卓手机访问时,服务器都没有反应。查阅了国外网站的资料后,发现时ssl证书的中间证书缺失问题。
如果发现有类似问题可以先从检查ssl证书开始:
https://www.myssl.cn/tools/check-server-cert.html
开启你的服务器,在上面网站上输入域名和端口号。如果检查的结果中有任何证书缺失,那么说明是我说的这个原因造成的。
ssl之所以英文叫做keychain,就是因为他其实不只是一个证书,而是一串证书依次证明。最高级的证书叫做根证书(root)的私钥一般放在和互联网隔绝的地方,所以使用这个证书来验证数据非常麻烦。于是通常使用这个证书签发一些中间证书。最终终端,比如像我们使用的证书是由这些中间证书签发的,而不是直接用根证书签发的。但如果我们要完整的验证一段数据,我们必须要有从根证书到终端证书的所有公钥。(大概原理是这样,具体的细节我也没有去穷究)
一般ssl服务商提供的证书会把这一串证书的公钥放到一个crt文件中。而flask只能配置一个crt文件(公钥),一个key文件(私钥)。这种情况下,可以直接把对应文件配置到flask中。很多时候ssh会给你很多种证书文件。你最好找文件名带bundle的那个crt文件。如果实在没有合并后的crt文件,你可以把多个证书的内容复制到一个文件中,参照下面例子。
1_root_bundle.crt 用根证书签发的中间证书
-----BEGIN CERTIFICATE-----
MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxd