Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为单元测试生成Android密钥认证格式的证书?_Android_X509 - Fatal编程技术网

如何为单元测试生成Android密钥认证格式的证书?

如何为单元测试生成Android密钥认证格式的证书?,android,x509,Android,X509,我需要在服务器上验证Android密钥认证过程生成的证书,但是我还不能访问真正的设备 如何生成扩展字段与实际设备相同的X.509证书 显然,根证书将是自签名的 这里有一些示例介绍如何使用我的值生成相同的证书 我更喜欢服务器端Java和Go。除了使用真正的设备,没有其他方法可以生成真正的Google签名证书 出于测试目的,可以生成与由Android密钥认证过程生成的值相同的Android证书,但是可以使用其他根证书进行签名 预期的证书结构 代码如下: (1) 从文件Google root

我需要在服务器上验证Android密钥认证过程生成的证书,但是我还不能访问真正的设备

如何生成扩展字段与实际设备相同的X.509证书

显然,根证书将是自签名的

这里有一些示例介绍如何使用我的值生成相同的证书


我更喜欢服务器端Java和Go。

除了使用真正的设备,没有其他方法可以生成真正的Google签名证书

出于测试目的,可以生成与由Android密钥认证过程生成的值相同的Android证书,但是可以使用其他根证书进行签名

预期的证书结构
代码如下: (1) 从文件
Google root ca/Google-1.pem
读取Google root证书,并将其用作模板来创建具有相同内容的新证书。 (2) 使用在步骤(1)中生成的根证书签名的硬件认证ID序列创建Android证书

主程序包
进口(
“加密/ecdsa”
“加密/椭圆”
“加密/兰德”
“加密/rsa”
“加密/x509”
“加密/x509/pkix”
“编码/asn1”
“编码/pem”
“io/ioutil”
“数学/大”
“时间”
)
func main(){
rootCACertBytes,rootCAPrivKey,err:=createCARoot()
如果错误!=零{
恐慌(错误)
}
rootCACert,err:=x509.ParseCertificate(rootCACertBytes)
如果错误!=零{
恐慌(错误)
}
androidCertBytes,err:=createAndroidKeystoreKey(rootCACert,rootCAPrivKey)
如果错误!=零{
恐慌(错误)
}
err=printCertInPEM(rootCACertBytes,“CA.pem”)
如果错误!=零{
恐慌(错误)
}
err=printCertInPEM(androidCertBytes,“android.pem”)
如果错误!=零{
恐慌(错误)
}
}
func createCARoot()([]字节,*rsa.PrivateKey,错误){
privKey,err:=rsa.GenerateKey(rand.Reader,4096)
如果错误!=零{
返回零,零,错误
}
certTemplate,错误:=readGoogleRootCA()
如果错误!=零{
返回零,零,错误
}
证书,错误:=x509.CreateCertificate(rand.Reader,certTemplate,certTemplate,privKey.Public(),privKey)
如果错误!=零{
返回零,零,错误
}
返回证书,私钥,无
}
func randomSerialNumber()(*big.Int,错误){
serialNumberLimit:=new(big.Int).Lsh(big.NewInt(1),128)
返回rand.Int(rand.Reader,serialNumberLimit)
}
func readGoogleRootCA()(*x509.Certificate,错误){
pemBytes,err:=ioutil.ReadFile(“google root ca/google-1.pem”)
如果错误!=零{
返回零,错误
}
已解码,剩余:=pem.Decode(pemBytes)
_=休息
返回x509.ParseCertificate(已解码的.Bytes)
}
func printCertInPEM(certBytes[]字节,输出文件字符串)错误{
返回ioutil.WriteFile(outFile,pem.EncodeToMemory(
&Block{Type:“CERTIFICATE”,Bytes:certBytes}),0644)
}
var androidKeyDetectionOID=[]int{1,3,6,1,4,11129,2,1,17}
func createAndroidKeystoreKey(rootCACert*x509.Certificate,rootCAKey*rsa.PrivateKey)([]字节,错误){
privKey,err:=ecdsa.GenerateKey(椭圆.P256(),rand.Reader)
如果错误!=零{
返回零,错误
}
过期:=time.Now().AddDate(10,0,0)
serialNumber,错误:=randomSerialNumber()
如果错误!=零{
返回零,错误
}
AndroidKeyDetectionExtension,错误:=CreateAndroidKeyDetectionExtension()
如果错误!=零{
返回零,错误
}
certTemplate:=&x509.Certificate{
SerialNumber:SerialNumber,
主题:pkix.Name{
CommonName:“Android密钥库密钥”,
},
NotBefore:time.Now(),
注:到期日,
KeyUsage:x509.KeyUsageDigitalSignature,
外部扩展:[]pkix.Extension{
{
Id:AndroidKeyDetectionoid,
值:AndroidKeyDetectionExtension,
},
},
}
返回x509.CreateCertificate(rand.Reader、certTemplate、rootCACert、privKey.Public()、rootCAKey)
}
func createAndRoidKeyDetectionExtension()([]字节,错误){
keyDesc:=KeyDescription{
认证版本:0,
认证安全级别:1,
KeymasterVersion:0,
KeymasterSecurityLevel:0,
认证挑战:[]字节(“abcdefg”),
UniqueID:[]字节{},
软件:授权列表{
DetectionIDSerial:[]字节{},
},
授权列表:授权列表{
认证ID序列:[]字节(“00112233445566778899”),
},
}
返回asn1.Marshal(keyDesc)
}
类型KeyDescription结构{
认证版本int
认证SecurityLevel asn1.枚举
密钥主版本int
KeymasterSecurityLevel asn1.枚举
验证挑战[]字节
唯一ID[]字节
软件强制授权列表
强制授权列表
}
//当nil值失败时,值被注释掉
类型授权列表结构{
//用途[]int`asn1:“标记:1,显式,设置,可选”`
//算法int`asn1:“标记:2,显式,可选”`
//KeySize int`asn1:“标记:3,显式,可选”`
//摘要[]int`asn1:“标记:5,显式,设置,可选”`
//Padding[]int`asn1:“标记:6,显式,设置,可选”`
//EcCurve int`asn1:“标记:10,显式,可选”`
//RsaPublicExponent`asn1:“标记:200,显式,可选”`
//RollbackResistance接口{}`asn1:“标记:303,显式,可选”`
//ActiveDateTime int`asn1:“标记:400,显式,可选”`
//OriginationExpireDateTime int`asn