openssl TLS的关系
TLS(Transport Layer Security,安全传输层),TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),它实现了将应用层的报文进行加密后再交由TCP进行传输的功能。
在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制(但是几乎和SSL3.0无差异),标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),可以说TLS就是SSL的新版本3.1,并同时发布“RFC2246-TLS加密协议详解”
1.0.0h的Openssl版本支持SSLv2,SSLv3和 TLSv1.0
从Openssl 1.0.1开始,添加了对TLSv1.1和TLSv1.2的支持
从Openssl 1.1.1开始支持TLS1.3
mac下的opessl默认是0.9,更新方式如下:
http://www.liuchungui.com/blog/2016/05/10/mac10-dot-11sheng-ji-an-zhuang-openssl/
生成公私钥(证书)
https://openhome.alipay.com/doc/docIndex.htm?url=https://openhome.alipay.com/doc/viewKbDoc.htm?key=236615_428849&type=info
注意 PKCS8格式私钥 是给java服务端用的,C++客户端使用RSA格式
PEM格式证书
PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:
内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
使用PEM格式存储的证书:
—–BEGIN CERTIFICATE—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE—–
使用PEM格式存储的私钥:
—–BEGIN RSA PRIVATE KEY—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END RSA PRIVATE KEY—–
使用PEM格式存储的证书请求文件:
—–BEGIN CERTIFICATE REQUEST—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE REQUEST—–
DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。
CER - 一般指使用DER格式的证书
编码格式转换
真正需要转换的是.pem与.der这两种证书文件,因为他们使用不同的编码方式
证书链
从https网站下载证书时,如果是3级证书链,则证书验证的时候,也需要有父证书,否则证书验证不过
Poco::Net::initializeSSL();
CString cstrRootCer = pahy::GetResourceDirectory()+_T("\\conf\\certificates\\rootcert.pem"); //所有
CString cstrTestCer = pahy::GetResourceDirectory()+_T("\\conf\\certificates\\Test.cer");
string strRootCer = TOOL_STRING::UnicodeToUTF8((LPCTSTR)cstrRootCer);
string strTestCer = TOOL_STRING::UnicodeToUTF8((LPCTSTR)cstrTestCer);
SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false);
Context::Ptr ptrContext = new Context(Context::TLSV1_2_CLIENT_USE, "", strTestCer, strRootCer, Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
浏览器证书验证
https://www.cnblogs.com/xiohao/p/9032481.html