几乎是问题所在.这两类根有什么区别?这些根签署的证书之间的差异?第1类签署的证书有什么用途,而第3类没有,反之亦然?
我有一个有两个https服务器的站点.一个(前端)提供由静态页面组成的UI.另一个(后端)提供微服务.他们俩都碰巧使用相同的(测试)X509证书来识别自己.单独地,我可以通过https连接到它们,需要客户端证书"tester".
到目前为止,我们通过nginx设置隐藏了CORS问题,这使得前端和后端看起来是相同的Origin.我已经为所有请求实现了标题'Access-Control-Allow-Origin','Access-Control-Allow-Credentials'; 使用方法,预检检查请求的标题(OPTIONS).
在Chrome中,像这样的跨站点工作得很好.我可以看到前端URL和后端URL是不同的站点.我看到在发出后端请求之前发出了OPTIONS请求.
即使Chrome似乎不需要它,我确实找到了将用于执行请求的xmlhttprequest对象并对其执行了操作xhr.withCredentials = true
,因为这似乎是fetch.js在它获取时所做的事情"credentials":"include"
.我注意到有一个xhr.setRequestHeader
可用的功能,我可能需要用来让Firefox开心.
有没有人在这里使用CORS结合这样的2路SSL证书,并且有这个Firefox问题并在某处修复了它.我怀疑它不是服务器端修复,而是客户端需要做的事情.
大多数CA都在销售不同"产品"的代码签名证书,如Verisign或Certum:
Microsoft Authenticode - "允许您签署EXE,OCX,DLL,bla ......"
Java CodeSign - "允许您签署Java代码"
软件发行商证书 - "允许您签署软件"
好吧,我真的对此感到困惑.所有这些产品有什么区别 - 除了价格?自从我很好奇以来,我曾几次询问Verisign和其他CA.但没有得到答案.
我从Certum CA获得了Authenticode证书.我在Internet Explorer中注册了它,将其导出为PKCS#12 PFX并且可以按照承诺签署EXE,DLL,....
现在......我尝试用keytool将这个PFX导入Java,然后我尝试签署一个JAR.它奏效了!
然后有神秘的"软件发行商证书"作为产品.我不知道我能/应该签什么...... Mac?Linux呢?"Microsoft Authenticode"也不是软件发行商证书吗?不是EXE"软件"吗?这真让我困惑.
那么,我现在的问题是:当我订购了Microsoft Authenticode证书时,使用它签署例如JAR文件或可能的其他内容是否非法?这些证书之间似乎没有技术差异.所有这些产品应该具有相同的代码签名EKU-OID"1.3.6.1.5.5.7.3.3",这在EXE,JAR,Adobe Air和周围也存在的地方之间没有任何区别.因此,如果所有"CodeSigning"证书在技术上都相同,那么为什么我要决定是否要成为"Java Developer"或"Windows Developer"或"Software Developer"?
也许证书仍有差异?当我使用Authenticode-certs签名时,我可能在JAR中没有足够的权限吗?
(PS:我不会在商业上使用我的软件!)
我需要让我的应用程序的用户使用他们的个人USB安全令牌签署他们的批准.
我已设法签署数据,但我无法获得有关谁使用了令牌的信息.
这是我到目前为止的代码:
CspParameters csp = new CspParameters(1, "SafeNet RSA CSP");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
// Create some data to sign.
byte[] data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine("Data : " + BitConverter.ToString(data));
// Sign the data using the Smart Card CryptoGraphic Provider.
byte[] sig = rsa.SignData(data, "SHA1");
Console.WriteLine("Signature : " + BitConverter.ToString(sig));
Run Code Online (Sandbox Code Playgroud)
令牌信息中有一个名为"令牌名称"的字段.我如何访问该字段以验证是否已使用令牌签署批准?
有条件的信息和更新:
当我访问需要PKI客户端证书的网站时,Firefox将允许用户选择要呈现的证书.
在Firefox中,如何在服务器上提供不同的PKI客户端证书?
我必须在不同平台和服务实现之间交换JSON对象,并通过数字签名使其完整性可验证.因此,平台A将创建这样的对象并创建数字签名.然后将所述签名包括在对象中并发送到平台B.JSON对象可以包含任意属性和数据.
例如在PHP中:
function signObject($jsonObjectToSign, $privateKey) {
$jsonObjectToSign->signature = "";
$msgToSign = json_encode($jsonObjectToSign);
openssl_sign($msgToSign, $jsonObjectToSign->signature, $privateKey, OPENSSL_SLGO_SHA1);
return $jsonObjectToSign;
}
Run Code Online (Sandbox Code Playgroud)
问题是,例如在Java中,无法判断JSON对象的属性是否与添加它们的顺序相同(通过JSONObject.put()).所以,如果我做了
$json = json_encode('{"a":1, "b":2}');
Run Code Online (Sandbox Code Playgroud)
在PHP中,如上所述签署此对象,将其传输到基于java的服务器,解码json对象,然后尝试验证签名,我可能会获得对象属性的不同顺序.
所以我需要的是一种从JSONObject创建String的可靠方法,与所使用的语言或平台无关.
上面的示例对象总是需要输出{"a":1, "b":2}
而且永远不会{"b":2, "a":1}
.不幸的是,这是例如在Java中的常见情况.
是否有任何"最佳实践"以安全的方式签署JSON对象?
但让我以另一种方式描述问题:
假设我想用Java(或任何其他语言)来做这件事:
JSONObject j = new JSONObject();
j.put("a", 1);
j.put("b", 2);
Run Code Online (Sandbox Code Playgroud)
现在,我需要一个序列化函数,它总是为这个对象输出相同的字符串表示,无论这个对象是如何以及用什么语言创建的.
迄今为止最长的证书链的长度是多少?
我想知道该链中证书颁发机构的数量,而不是证书链的大小。
如何在C中实现它?
openssl req -new -key cert.key -out cert.csr
openssl x509 -req -in cert.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out cert.crt -days 5000
Run Code Online (Sandbox Code Playgroud) 我想使用TLS相互身份验证来验证在go中制作的API上的客户端.我已经创建了一个证书颁发机构,让我们说Bob有一个他希望与客户端一起使用的密钥对.Bob创建了一个证书请求,并希望我验证他的证书,以便在API上进行授权和身份验证.
我用它来创建我的证书颁发机构:
openssl genrsa -aes256 -out ca.key 4096
openssl req -new -x509 -sha256 -days 730 -key ca.key -out ca.crt
Run Code Online (Sandbox Code Playgroud)
Bob用它来创建他的证书和证书请求:
openssl genrsa -out bob.key 4096
openssl req -new -key bob.key -out bob.csr
Run Code Online (Sandbox Code Playgroud)
我想得到这个,但是在去:
openssl x509 -req -days 365 -sha256 -in bob.csr -CA ca.crt -CAkey ca.key -set_serial 3 -out bob.crt
Run Code Online (Sandbox Code Playgroud)
现在,使用theses命令,Bob可以创建一个到我的API的TLS连接,使用这个tls.Config:
func createTLSConfig(certFile string, keyFile string, clientCAFilepath string) (config *tls.Config, err error) {
cer, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
return nil, err
}
clientCAFile, err := ioutil.ReadFile(clientCAFilepath) …
Run Code Online (Sandbox Code Playgroud) 有人可以对我正在考虑的微服务安全设计发表评论,审核,评论或其他方面的评论吗?
假设我有三个微服务,每个微服务通过REST端点与另外两个微服务进行通信.每个微服务都包含一个密钥库.在此密钥库中包含由受信任的证书颁发机构签名的微服务的私有/公共密钥对.此密钥库中还有另外两个微服务的公钥证书,这些证书是从源微服务的签名/可信密钥对导出的.
这种实现方式有效,但有些事情并不十分正确.
也就是说,每次我引入一个新的微服务时,我必须将每个现有微服务的公钥证书添加到其密钥库,以及b)新微服务的公钥证书到其他所有微服务(假设新的微服务必须双向通信,并且安全地,与每个现有的微服务).
现在,为第二个密钥对重复上述模式,这个密钥对用于签署/验证REST调用中提供的身份验证令牌.
我想知道,除了上述之外,是否a)建议并且b)在所有微服务之间共享一个可信的公钥证书是否安全?完全不同的东西?
请礼貌.我绝不是这方面的专家.
编辑: 在我阅读原帖后的回复/评论之后,我发现我省略了可能使问题更加清晰的细节,因此评论者能够更好地解决这个问题:
有问题的微服务存在于专用Intranet内,并且只能由该Intranet内的客户端(浏览器或其他微服务)访问.
实际上有一个受信任的CA--即拥有此内部网的公司 - 并且是CA签署微服务的密钥对.
看来,这个问题的解决方案隐含在@Andreas的第一条评论中,他写道:"只要发布它们的CA受到信任,它们也会受到信任."
只要每个新的微服务都部署有a)自己的密钥对,由CA签署(一个用于签名,另一个用于加密),以及b)CA的证书,我可以部署新的微服务,并且合理保证他们将与所有其他微服务(合理的,因为我甚至不知道其他潜在的漏洞).
不知何故,我想到了我必须为每个微服务的密钥对创建一个全新的证书,并将其包含在其他微服务的密钥库中(重复每个新的微服务).相反,我需要的只是一个证书,即在每个微服务的密钥库中签署密钥对的CA的证书.