- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是公共密码学的新手。我对此有清楚的了解,但对于过去8周无法解决的一些问题感到困惑。因此,我会尽力解释清楚,以传达我的困惑。
我试图了解CA公共证书和代码签名的作用,因此手动进行模拟。
密钥库
acmesoft.jks(充当CA)
cindy.jks(acmesoft的雇员)
me.jks(acmesoft的雇员)
初步设置
Acmesoft生成密钥对并将其公共密钥分发给员工(CA证书)
cindy将CA证书导入到cindy.jks
我将CA证书导入给我
目标
我想jar一些文件,生成证书(ME cert),让acmesoft(CA)签名证书,然后签名jar文件以发送给cindy
这是我的困惑。
为了实现上述目标,哪个过程是正确的?
流程1按时间顺序
我生成密钥对(ME证书)
我罐一个文件(我罐)
发送给CA的ME证书(CA将使用其私钥进行签名。MEsigned_cert将具有带有CA私钥签名的ME公钥)
我将此ME Signed_cert交给cindy
cindy导入ME signature_cert受信任的证书而没有问题,因为cindy早已导入了CA证书
我使用ME私钥(不是ME Signed_cert)对ME jar进行了签名
我把我的jar文件交给cindy
cindy是否在我的jar上进行jarsigner验证
流程1问题
Cindy密钥库将具有由ME公钥和CA签名组成的ME signed_certs。 cindy.jks上的ME jar上的jarsigner验证未找到密钥。
我希望它显示找到的密钥,因为cindy.jks中的ME signed_cert具有带有CA私有签名的ME公钥,并且ME jar文件是使用ME私有密钥签名的。
工程2
与过程1完全相同,但:
我从acmesoft(由ME公钥和CA签名组成)中将返回的ME signed_certs导入ME jks
ME使用jarsigner对ME jar文件进行签名
流程2问题
签名后,jarsigner会投诉以下内容:
jarsigner:找不到证书链:primary_root。 primary_root必须引用有效的KeyStore密钥条目,该条目包含私钥和相应的公钥证书链。
当然我得到上面的错误。 ME.jks没有CA的私钥。我不应该拥有CA私钥。
因此,我不确定过程2的工作方式。这是对的还是我的理解是错误的。
这是实际的密钥库:
Acmesoft
Alias name: acmeroot
Creation date: 2-Feb-2015
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=acmesoft, OU=information resources department, O=certificate authority, L=toronto, ST=ontario, C=ca
Issuer: CN=acmesoft, OU=information resources department, O=certificate authority, L=toronto, ST=ontario, C=ca
Serial number: 381e5a1f
Valid from: Mon Feb 02 00:01:14 EST 2015 until: Sun May 03 01:01:14 EDT 2015
Certificate fingerprints:
MD5: 94:A1:76:2F:D5:05:8D:3C:2C:0F:B2:07:EC:9A:1E:12
SHA1: AD:0A:28:AD:D9:42:C8:B3:C7:7D:CB:36:6F:EF:2C:99:50:00:30:3C
SHA256: 31:14:A0:F8:51:72:37:7C:F5:25:6C:3A:F3:10:74:D8:F8:2B:B8:BC:FE:C7:F3:56:89:00:C4:6B:36:48:B2:A4
Signature algorithm name: SHA1withDSA
Version: 3
Alias name: ME
Creation date: 23-Jan-2015
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=kim yap, OU=rbss, O=cibc, L=toronto, ST=ontario, C=ca
Issuer: CN=kim yap, OU=rbss, O=cibc, L=toronto, ST=ontario, C=ca
Serial number: 4ecdc79c
Valid from: Fri Jan 23 11:10:12 EST 2015 until: Thu Apr 23 12:10:12 EDT 2015
Certificate fingerprints:
MD5: 1A:FC:CF:40:4B:F7:1E:57:ED:28:1E:9B:5A:86:82:3E
SHA1: 74:02:90:B5:DE:76:D4:04:21:23:2B:B8:6F:7C:B5:D4:41:5B:91:FB
SHA256: B9:F6:A7:75:89:9F:0B:1F:29:DA:29:71:C1:18:1E:2D:BB:2F:35:41:4F:BA:D7:7C:50:CD:1A:CC:54:B7:12:37
Signature algorithm name: SHA1withDSA
Version: 3
Public Key: 02 81 80 79 14 21 28 57 EF 30 0D 98 0D 1A 8B EB 35 C3 76 06 0C FC DC D1 40 A6 0B 30 A4 F0 6E 24 AC 92 2D 44 F9 8F BB F9 51 6D 7F 99 F2 18 A4 55 2F D4 4A 1D 4F CC 9B 3D 5F 00 F6 95 58 77 E3 7E AD 2D 87 79 B7 9F BD 35 1D DC AF 7E 24 EC C7 09 20 C4 3D CA E6 5F 59 49 A9 00 DC 4B 06 CF 37 30 65 4E AC CB 80 50 F4 F4 21 8E DD 81 99 14 AA 9E 3A 07 C3 1B 2E 76 61 F9 B8 51 2A E0 A6 BA 55 0E DB 90 19
Alias name: acmeroot
Creation date: 2-Feb-2015
Entry type: trustedCertEntry
Owner: CN=acmesoft, OU=information resources department, O=certificate authority, L=toronto, ST=ontario, C=ca
Issuer: CN=acmesoft, OU=information resources department, O=certificate authority, L=toronto, ST=ontario, C=ca
Serial number: 381e5a1f
Valid from: Mon Feb 02 00:01:14 EST 2015 until: Sun May 03 01:01:14 EDT 2015
Certificate fingerprints:
MD5: 94:A1:76:2F:D5:05:8D:3C:2C:0F:B2:07:EC:9A:1E:12
SHA1: AD:0A:28:AD:D9:42:C8:B3:C7:7D:CB:36:6F:EF:2C:99:50:00:30:3C
SHA256: 31:14:A0:F8:51:72:37:7C:F5:25:6C:3A:F3:10:74:D8:F8:2B:B8:BC:FE:C7:F3:56:89:00:C4:6B:36:48:B2:A4
Signature algorithm name: SHA1withDSA
Version: 3
*******************************************
*******************************************
Alias name: ME_signedby_acmesoft
Creation date: 11-Feb-2015
Entry type: trustedCertEntry
Owner: CN=kim yap, OU=rbss, O=cibc, L=toronto, ST=ontario, C=ca
Issuer: CN=acmesoft, OU=information resources department, O=certificate authority, L=toronto, ST=ontario, C=ca
Serial number: 4ecdc79c
Valid from: Fri Jan 23 11:10:12 EST 2015 until: Thu Apr 23 12:10:12 EDT 2015
Certificate fingerprints:
MD5: AF:27:8B:63:86:A7:3F:FE:D9:03:64:3E:AB:7E:CE:DF
SHA1: 2E:8A:78:ED:14:12:00:78:67:91:EE:8D:79:45:56:34:FC:17:02:FE
SHA256: 28:60:A4:20:F1:7E:D3:3B:11:7E:D1:A1:04:F3:3C:70:43:92:91:16:CD:D6:96:A6:CC:71:94:10:1B:26:9D:09
Signature algorithm name: SHA1withDSA
Version: 3
Public Key: 02 81 80 79 14 21 28 57 EF 30 0D 98 0D 1A 8B EB 35 C3 76 06 0C FC DC D1 40 A6 0B 30 A4 F0 6E 24 AC 92 2D 44 F9 8F BB F9 51 6D 7F 99 F2 18 A4 55 2F D4 4A 1D 4F CC 9B 3D 5F 00 F6 95 58 77 E3 7E AD 2D 87 79 B7 9F BD 35 1D DC AF 7E 24 EC C7 09 20 C4 3D CA E6 5F 59 49 A9 00 DC 4B 06 CF 37 30 65 4E AC CB 80 50 F4 F4 21 8E DD 81 99 14 AA 9E 3A 07 C3 1B 2E 76 61 F9 B8 51 2A E0 A6 BA 55 0E DB 90 19
public class CertificateSigner
{
public static void main(String[] args)
{
String ksname = null; // the keystore name
String alias = null; // the private key alias
String inname = null; // the input file name
String outname = null; // the output file name
for (int i = 0; i < args.length; i += 2)
{
if (args[i].equals("-keystore")) ksname = args[i + 1];
else if (args[i].equals("-alias")) alias = args[i + 1];
else if (args[i].equals("-infile")) inname = args[i + 1];
else if (args[i].equals("-outfile")) outname = args[i + 1];
else usage();
}
if (ksname == null || alias == null || inname == null || outname == null) usage();
try
{
Console console = System.console();
if (console == null) error("No console");
char[] password = console.readPassword("Keystore password: ");
KeyStore store = KeyStore.getInstance("JKS", "SUN");
InputStream in = new FileInputStream(ksname);
store.load(in, password);
Arrays.fill(password, ' ');
in.close();
char[] keyPassword = console.readPassword("Key password for %s: ", alias);
PrivateKey issuerPrivateKey = (PrivateKey) store.getKey(alias, keyPassword);
Arrays.fill(keyPassword, ' ');
if (issuerPrivateKey == null) error("No such private key");
in = new FileInputStream(inname);
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate inCert = (X509Certificate) factory.generateCertificate(in);
in.close();
byte[] inCertBytes = inCert.getTBSCertificate();
X509Certificate issuerCert = (X509Certificate) store.getCertificate(alias);
Principal issuer = issuerCert.getSubjectDN();
String issuerSigAlg = issuerCert.getSigAlgName();
FileOutputStream out = new FileOutputStream(outname);
X509CertInfo info = new X509CertInfo(inCertBytes);
info.set(X509CertInfo.ISSUER, new CertificateIssuerName((X500Name) issuer));
X509CertImpl outCert = new X509CertImpl(info);
outCert.sign(issuerPrivateKey, issuerSigAlg);
outCert.derEncode(out);
out.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void error(String message)
{
System.out.println(message);
System.exit(1);
}
public static void usage()
{
System.out.println("Usage: java CertificateSigner"
+ " -keystore keyStore -alias issuerKeyAlias"
+ " -infile inputFile -outfile outputFile");
System.exit(1);
}
}
最佳答案
流程1按时间顺序
我将此ME Signed_cert交给cindy
否。ME使用相同的别名将此签名证书导入其密钥库。
cindy导入ME signature_cert受信任的证书而没有问题,因为cindy早已导入了CA证书
不需要。
我使用ME私钥(不是ME Signed_cert)对ME jar进行了签名
正确,尽管区别是无效的,因为您只提供了别名,而别名涵盖了两者。
我把我的jar文件交给cindy
cindy是否在我的jar上进行jarsigner验证
正确。
流程1问题
Cindy密钥库将具有由ME公钥和CA签名组成的ME signed_certs。
否。请参见上文。
cindy.jks上的ME jar上的jarsigner验证未找到密钥。
然后您没有正确签名。往上看。
我希望它显示找到的密钥,因为cindy.jks中的ME signed_cert具有带有CA私有签名的ME公钥,并且ME jar文件是使用ME私有密钥签名的。
不需要。我不知道“找到密钥”的意思,但是Cindy将没有您的私钥,也不需要它来验证JAR文件。实际上,她甚至不需要自己的KeyStore。证书链位于JAR文件中。
工程2
与过程1完全相同,但:
我从acmesoft(由> ME公钥和CA签名组成)中将返回的ME signature_certs导入ME jks
ME使用jarsigner对ME jar文件进行签名
流程2问题
签名后,jarsigner会投诉以下内容:
jarsigner:找不到证书链:primary_root。 primary_root必须引用有效的KeyStore密钥条目,该条目包含私钥和相应的公钥证书链。
您没有正确导入签名证书。您必须使用与生成密钥对和CSR时相同的别名。这是签名证书与私钥关联的唯一方法。
关于java - 安全证书-了解CA在代码签名中的角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28652223/
我开始在 Ethereum blockchain 上了解如何开发智能合约以及如何写 web-script用于与智能合约交互(购买、销售、统计......)我得出了该怎么做的结论。我想知道我是否正确理解
我正在 UIView 中使用 CATransform3DMakeRotation,并且我正在尝试进行 45º,变换就像向后放置一样: 这是我拥有的“代码”,但显然没有这样做。 CATransform3
我目前正在测试 WebRTC 的功能,但我有一些脑逻辑问题。 WebRTC 究竟是什么? 我只读了“STUN”、“P2P”和其他...但是在技术方面什么是正确的 WebRTC(见下一个) 我需要什么
我在看 DelayedInit在 Scala in Depth ... 注释是我对代码的理解。 下面的 trait 接受一个非严格计算的参数(由于 => ),并返回 Unit .它的行为类似于构造函数
谁能给我指出一个用图片和简单的代码片段解释 WCF 的资源。我厌倦了谷歌搜索并在所有搜索结果中找到相同的“ABC”文章。 最佳答案 WCF 是一项非常复杂的技术,在我看来,它的文档记录非常少。启动和运
我期待以下 GetArgs.hs打印出传递给它的参数。 import System.Environment main = do args main 3 4 3 :39:1: Coul
private int vbo; private int ibo; vbo = glGenBuffers(); ibo = glGenBuffers(); glBindBuffer(GL_ARRAY_
我正在尝试一个 for 循环。我添加了一个 if 语句以在循环达到 30 时停止循环。 我见过i <= 10将运行 11 次,因为循环在达到 10 次时仍会运行。 如果有设置 i 的 if 语句,为什
我正在尝试了解 WSGI 的功能并需要一些帮助。 到目前为止,我知道它是一种服务器和应用程序之间的中间件,用于将不同的应用程序框架(位于服务器端)与应用程序连接,前提是相关框架具有 WSGI 适配器。
我是 Javascript 的新手,我正在尝试绕过 while 循环。我了解它们的目的,我想我了解它们的工作原理,但我在使用它们时遇到了麻烦。 我希望 while 值自身重复,直到两个随机数相互匹配。
我刚刚偶然发现Fabric并且文档并没有真正说明它是如何工作的。 我有根据的猜测是您需要在客户端和服务器端都安装它。 Python 代码存储在客户端,并在命令运行时通过 Fabric 的有线协议(pr
我想了解 ConditionalWeakTable .和有什么区别 class ClassA { static readonly ConditionalWeakTable OtherClass
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我还没有成功找到任何可以引导我理解 UIPickerView 和 UIPickerView 模型的好例子。有什么建议吗? 最佳答案 为什么不使用默认的 Apple 文档示例?这是来自苹果文档的名为 U
我在看foldM为了获得关于如何使用它的直觉。 foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a 在这个简单的例子中,我只返回 [Just
答案What are _mm_prefetch() locality hints?详细说明提示的含义。 我的问题是:我想要哪一个? 我正在处理一个被重复调用数十亿次的函数,其中包含一些 int 参数。
我一直在读这个article了解 gcroot 模板。我明白 gcroot provides handles into the garbage collected heap 然后 the handle
提供了一个用例: 流处理架构;事件进入 Kafka,然后由带有 MongoDB 接收器的作业进行处理。 数据库名称:myWebsite集合:用户 并且作业接收 users 集合中的 user 记录。
你好 我想更详细地了解 NFS 文件系统。我偶然发现了《NFS 图解》这本书,不幸的是它只能作为谷歌图书提供,所以有些页面丢失了。有人可能有另一个很好的资源,这将是在较低级别上了解 NFS 的良好开始
我无法理解这个问题,哪个更随机? rand() 或: rand() * rand() 我发现这是一个真正的脑筋急转弯,你能帮我吗? 编辑: 凭直觉,我知道数学答案是它们同样随机,但我忍不住认为,如果您
我是一名优秀的程序员,十分优秀!