有没有人看到过使用指纹代替公钥固定Alamofire的方法?
对不起,如果已经回答,我还没有在任何地方看到它。
由于
答案 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