马上要到17年1月1日了,苹果要求使用HTTPS协议,很多第三方SDK都已经适配了,这里我先提前备好
为服务器生成证书
'生成服务器证书'
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
'导入到服务端keystore中'
keytool -import -v -file client.cer -keystore server.keystore
'把服务器证书导出为CER文件'
keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer (tomcat为你设置服务器端的证书名,路径换成自己的路径)
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="密码" />
注意服务端证书名保持一致属性说明:
clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
keystoreFile:服务器证书文件路径
keystorePass:服务器证书密码
truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
truststorePass:根证书密码
单向验证
clientAuth:设置false
双向验证
clientAuth设置true. 那么客户端必须要有 client.p12文件才能访问tomcat服务器,
还需要在客户端安装服务器证书,双击“tomcat.cer”,按照提示安装证书,将证书填入到“受信任的根证书颁发机构”。
iOS单向验证
证书用tomcat.cer
//先导入证书,找到证书的路径
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"证书名" ofType:@"cer"];
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO;
NSSet *set = [[NSSet alloc] initWithObjects:cerData, nil];
securityPolicy.pinnedCertificates = set;
//在AFN设置上securityPolicy
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy = securityPolicy;
双向认证
请移步下面链接,不清楚苹果到时候让不让单向认证,目前只使用了单向认证,如果不让请留言提示下我
http://www.jianshu.com/p/9e573607be13
解决SecCertificateCreateWithData崩溃
有些人直接用后台给的证书会出现SecCertificateCreateWithData崩溃,这是因为证书的问题,证书多加密了一层BASE64加密,
两种证书的不同
右键用文本编辑软件打开就能看到
解决方式
第一种方法:把证书里面的字符串复制出来,然后解BASE64后再转Data。
第二种方法:用mac系统的字符串工具把证书导入进来,然后再导出成cer,这个cer就可以直接使用
方法一相对于方法二更安全些,证书文件不会在包里出现
第一种方法
把需要处理的证书里面的文字,全部拷到项目里
需要注意的是把下面这两行去掉,只留中间的字符串
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
解BASE64编码
NSData *cerData = [[NSData alloc] initWithBase64EncodedString:httpsKEY options:0];
然后按单向认证中的方法直接使用Data就行了
第二种方法
如果解决了你的问题,希望给个喜欢
如果我写的有什么问题,欢迎留言指出
TomCat自建证书参考
http://www.jianshu.com/p/2a7fbda9de5b
http://blog.csdn.net/xxd851116/article/details/18701731
网友评论