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

内容类型:表明本文件存放的是什么信息内容,它的形式为“——-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);