馬上要到17年1月1日了,蘋果要求使用HTTPS協(xié)議,很多第三方SDK都已經(jīng)適配了,這里我先提前備好
為服務(wù)器生成證書
'生成服務(wù)器證書'
keytool -genkey -v -alias tomcat -keyalg RSA -keystore server.keystore -validity 36500
'生成客戶端證書'
keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore client.p12 -validity 36500
'生成客戶端p12證書信任文件'
keytool -export -alias mykey -keystore client.p12 -storetype PKCS12 -storepass 密碼 -rfc -file client.cer
'導(dǎo)入到服務(wù)端keystore中'
keytool -import -v -file client.cer -keystore server.keystore
'把服務(wù)器證書導(dǎo)出為CER文件'
keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer (tomcat為你設(shè)置服務(wù)器端的證書名,路徑換成自己的路徑)
TomCat 的conf文件夾下
修改 server.xml文件
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:\\tomcat.keystore" keystorePass="密碼"
truststoreFile="D:\\tomcat.keystore" truststorePass="密碼" />
注意服務(wù)端證書名保持一致屬性說明:
clientAuth:設(shè)置是否雙向驗(yàn)證,默認(rèn)為false,設(shè)置為true代表雙向驗(yàn)證
keystoreFile:服務(wù)器證書文件路徑
keystorePass:服務(wù)器證書密碼
truststoreFile:用來驗(yàn)證客戶端證書的根證書,此例中就是服務(wù)器證書
truststorePass:根證書密碼
單向驗(yàn)證
clientAuth:設(shè)置false
雙向驗(yàn)證
clientAuth設(shè)置true. 那么客戶端必須要有 client.p12文件才能訪問tomcat服務(wù)器,
還需要在客戶端安裝服務(wù)器證書,雙擊“tomcat.cer”,按照提示安裝證書,將證書填入到“受信任的根證書頒發(fā)機(jī)構(gòu)”。
iOS單向驗(yàn)證
證書用tomcat.cer
//先導(dǎo)入證書,找到證書的路徑
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"證書名" ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用證書驗(yàn)證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認(rèn)為NO
//如果是需要驗(yàn)證自建證書,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES;
//假如證書的域名與你請(qǐng)求的域名不一致,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書,也可以建立連接,這個(gè)非常危險(xiǎn),建議打開。
//置為NO,主要用于這種情況:客戶端請(qǐng)求的是子域名,而證書上的是另外一個(gè)域名。因?yàn)镾SL證書上的域名是獨(dú)立的,假如證書上注冊(cè)的域名是www.google.com,那么mail.google.com是無法驗(yàn)證通過的;當(dāng)然,有錢可以注冊(cè)通配符的域名*.google.com,但這個(gè)還是比較貴的。
//如置為NO,建議自己添加對(duì)應(yīng)域名的校驗(yàn)邏輯。
securityPolicy.validatesDomainName = NO;
NSSet *set = [[NSSet alloc] initWithObjects:cerData, nil];
securityPolicy.pinnedCertificates = set;
//在AFN設(shè)置上securityPolicy
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy = securityPolicy;
雙向認(rèn)證
請(qǐng)移步下面鏈接,不清楚蘋果到時(shí)候讓不讓單向認(rèn)證,目前只使用了單向認(rèn)證,如果不讓請(qǐng)留言提示下我
http://www.itdecent.cn/p/9e573607be13
解決SecCertificateCreateWithData崩潰
有些人直接用后臺(tái)給的證書會(huì)出現(xiàn)SecCertificateCreateWithData崩潰,這是因?yàn)樽C書的問題,證書多加密了一層BASE64加密,
兩種證書的不同
右鍵用文本編輯軟件打開就能看到


解決方式
第一種方法:把證書里面的字符串復(fù)制出來,然后解BASE64后再轉(zhuǎn)Data。
第二種方法:用mac系統(tǒng)的字符串工具把證書導(dǎo)入進(jìn)來,然后再導(dǎo)出成cer,這個(gè)cer就可以直接使用
方法一相對(duì)于方法二更安全些,證書文件不會(huì)在包里出現(xiàn)
第一種方法
把需要處理的證書里面的文字,全部拷到項(xiàng)目里

需要注意的是把下面這兩行去掉,只留中間的字符串
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
解BASE64編碼
NSData *cerData = [[NSData alloc] initWithBase64EncodedString:httpsKEY options:0];
然后按單向認(rèn)證中的方法直接使用Data就行了
第二種方法



如果解決了你的問題,希望給個(gè)喜歡
如果我寫的有什么問題,歡迎留言指出
TomCat自建證書參考
http://www.itdecent.cn/p/2a7fbda9de5b
http://blog.csdn.net/xxd851116/article/details/18701731