我是安卓新手。我已经为 ios 编写了代码,并希望在 android 中使用类似的算法。
这里是场景。我有 2 种类型的服务器 - 1. 带有自签名证书 2. 带有签名证书。
现在在 ios 中,我使用以下步骤来确定它是否已签名。
STACK_OF(X509) *stX509Certificate = SSL_get_peer_cert_chain(ssl); int cert_num = sk_X509_num(stX509Certificate);
CFMutableArrayRef certArray = CFArrayCreateMutable(NULL, cert_num, NULL);
for (int i = 0; i < cert_num; i++) {
unsigned char *raw = NULL;
X509 *x509Certificate = sk_X509_value(stX509Certificate, i);
int rawlen = i2d_X509(x509Certificate, &raw);
CFDataRef cfcert = CFDataCreate(NULL, raw, rawlen);
free(raw);
SecCertificateRef secCertRef = SecCertificateCreateWithData(NULL, cfcert);
CFRelease(cfcert);
CFArrayAppendValue(certArray, secCertRef);
}
CFStringRef servAddr = CFStringCreateWithCString(NULL, [[srvSplit objectAtIndex:0] cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8);
SecPolicyRef secPolRef = SecPolicyCreateSSL(YES, servAddr);
CFRelease(servAddr);
SecTrustRef secTruRef ;
SecTrustResultType secTrustRes;
Boolean isCertTrusted = NO;
if(SecTrustCreateWithCertificates(certArray, secPolRef, &secTruRef) == errSecSuccess) {
SecTrustSetAnchorCertificatesOnly(secTruRef, NO);
if (SecTrustEvaluate(secTruRef,&secTrustRes) == errSecSuccess) {
switch (secTrustRes) {
case kSecTrustResultInvalid:
case kSecTrustResultDeny:
case kSecTrustResultRecoverableTrustFailure:
case kSecTrustResultFatalTrustFailure:
case kSecTrustResultOtherError:
isCertTrusted = NO;
break;
case kSecTrustResultUnspecified:
case kSecTrustResultProceed:
isCertTrusted = YES;
break;
}
}
}
在android中我找不到这样TrustEvaluate
的方法。我试过getBasicConstraints
了getKeyUsage
。但我无法区分签名证书和其他证书。
请帮我。