美文网首页iOS工程实践https数字证书(信息安全)
TomCat自建证书,iOS HTTPS连接使用并解决AFNet

TomCat自建证书,iOS HTTPS连接使用并解决AFNet

作者: 笨鸟不飞飞 | 来源:发表于2016-12-14 16:37 被阅读1429次

马上要到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加密,


两种证书的不同
右键用文本编辑软件打开就能看到

屏幕快照 2017-01-16 下午3.33.11.png 屏幕快照 2017-01-16 下午3.33.34.png

解决方式
第一种方法:把证书里面的字符串复制出来,然后解BASE64后再转Data。
第二种方法:用mac系统的字符串工具把证书导入进来,然后再导出成cer,这个cer就可以直接使用
方法一相对于方法二更安全些,证书文件不会在包里出现
第一种方法
把需要处理的证书里面的文字,全部拷到项目里

屏幕快照 2017-01-16 下午3.37.28.png

需要注意的是把下面这两行去掉,只留中间的字符串

-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

解BASE64编码

NSData *cerData = [[NSData alloc] initWithBase64EncodedString:httpsKEY options:0];

然后按单向认证中的方法直接使用Data就行了


第二种方法

屏幕快照 2016-12-14 下午4.31.49.png 屏幕快照 2016-12-14 下午4.32.18.png 屏幕快照 2016-12-14 下午4.32.28.png

如果解决了你的问题,希望给个喜欢
如果我写的有什么问题,欢迎留言指出


TomCat自建证书参考
http://www.jianshu.com/p/2a7fbda9de5b
http://blog.csdn.net/xxd851116/article/details/18701731

相关文章

网友评论

    本文标题:TomCat自建证书,iOS HTTPS连接使用并解决AFNet

    本文链接:https://www.haomeiwen.com/subject/exwimttx.html