在Alamofire中使用指纹进行SSL固定

时间:2016-05-10 03:34:50

标签: alamofire fingerprint pinning

有没有人看到过使用指纹代替公钥固定Alamofire的方法?

对不起,如果已经回答,我还没有在任何地方看到它。

由于

3 个答案:

答案 0 :(得分:3)

这最终非常直接。下面的代码可能不完美,我的真实代码正在进行一些附加检查,但这是其中的大部分内容。

.SHA1Fingerprint是SecCertificate上的一种扩展方法,它将其复制到NSData中,然后将其转换为SHA1。我使用RNCryptor来做到这一点,但你可以这样做。

isValidFingerprint只是将结果与我的每个已知指纹进行比较。

这一切都挂掉了我的静态Alamofire.Manager。

for(int i=0;i<buildings.Count; i++){
    var kitchenRoom = buildings[i] as KitchenRoom; //Cast to a KitchenRoom. Method returns null if it fails
    if(kitchenRoom != null)
        kitchenRoom.reference.someMethod();
} 

答案 1 :(得分:1)

雨燕4

我更改了鲍勃答案,并且对我有用,您可以根据需要更改验证算法,此代码仅检查固定证书之一是否有效。 this link帮助我了解了我的问题

I_ID    Value   IsChecked   Region  PB_ID   Code    
----    -----   ---------   ------  -----   ----    
1       A       0           N1      1       A1  
1       A       0           N1      2       A2  
2       B       1           N1      null    null    
3       C       0           N2      1       A1  
3       C       0           N2      4       C1  

要转换var postData = $.param(formData) + '&' + $.param(formTRData) + '&' + $.param(formTRData) + '&' + $.param(formTLData) + '&' + $.param(formBRData) + '&' + $.param(formBLData); $.ajax({ url: 'aaaaa.php', type: 'POST', data: postData (此行private static var Manager : Alamofire.SessionManager = { let man = Alamofire.SessionManager() man.delegate.sessionDidReceiveChallenge = { session, challenge in var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling var credential: URLCredential? if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { let host = challenge.protectionSpace.host if let serverTrust = challenge.protectionSpace.serverTrust { let serverTrustPolicy = ServerTrustPolicy.performDefaultEvaluation(validateHost: true) if serverTrustPolicy.evaluate(serverTrust, forHost: host) { disposition = .useCredential credential = URLCredential(trust: serverTrust) } else { disposition = .cancelAuthenticationChallenge return (disposition, credential) } let fingerPrints = [ "AJKSFGSGFR64563RFGY874FG43G784F48FG4F4GF74GF4F7G4FGF4F74F7GFF58Y".lowercased(), "BJKSFGSGFR64563RFGY874FG43G784F48FG4F4GF74GF4F7G4FGF4F74F7GFF58Y".lowercased(), "CJKSFGSGFR64563RFGY874FG43G784F48FG4F4GF74GF4F7G4FGF4F74F7GFF58Y".lowercased() ] for index in 0..<SecTrustGetCertificateCount(serverTrust) { let cer = SecTrustGetCertificateAtIndex(serverTrust, index) if let certificate = SecTrustGetCertificateAtIndex(serverTrust, index) { let certData = certificate.data let certHashByteArray = certData.sha256() let certificateHexString = certHashByteArray.toHexString().lowercased() if fingerPrints.contains(certificateHexString) { return (disposition, credential) } } } } } disposition = .cancelAuthenticationChallenge return (disposition, credential) } return man }() ),请使用此扩展名

SecTrustGetCertificateAtIndex(serverTrust, index)

对于我使用CryptoSwift library的这两行,您可以使用sha1而不是sha256,我将证书固定为sha256指纹。

let certData = certificate.data

答案 2 :(得分:0)

我可以问你为什么试图钉住指纹而不是公钥或证书吗?

根据我的经验,固定的关键是在程序中硬编码。

供参考: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning