我正在使用Ruby/Rails开发SAML网关,并且我正在尝试编写一些代码来验证传入SAML响应的xml数字签名与原始服务的x509证书.
我的问题:签名依赖于XML的规范化版本被散列,然后签约,我无法找到一个Ruby的lib /宝石,将规范化每个XML 规范.我在rubyforge上发现了一个超级旧的宝石,但是如果像nokogiri这样的功能支持这种功能我会更感兴趣(来自nokogiri docs,它没有).
我已经广泛搜索过了,但我想在这里问一下是否有人有任何好的见解,然后再尝试编写我自己的版本或重新编写现有的c14n-r库.
我正在实现自动更新功能,并需要一些有关如何使用最佳实践安全地执行此操作的建议.我想使用下载文件的Authenticode签名来验证它是否可以安全运行(即来自我们公司并且没有被篡改).我的问题与问题#2008519非常相似.
最底线的问题:检查自动更新功能的Authenticode签名的最佳,最安全的方法是什么?应检查证书中的哪些字段?要求是:(1)检查签名是否有效,(2)检查签名是否有效,(3)旧客户仍然可以在我的证书到期时更新,我得到一个新签名.
以下是我研究的一些背景信息/想法:我相信这可以分为两个步骤:
验证签名是否有效.我相信这应该很容易使用WinVerifyTrust,如http://msdn.microsoft.com/en-us/library/aa382384(VS.85).aspx中所述 - 我不认为这里有问题.
验证签名是否与我们公司相对应,而不是其他公司.这似乎是一个更难回答的问题:
一种可能性是检查签名中的一些字符串.可以通过MS KB文章#323809的代码获得,但是本文不会就应该为这种类型的应用程序(或任何其他类似的)检查哪些字段提出建议. 问题#1072540还说明了如何获取某些证书信息,但同样不建议实际检查哪些字段.我担心的是字符串可能不是最好的检查:例如,如果另一个人能够获得具有相同名称的证书,该怎么办?或者,如果我们有正当理由在将来更改字符串?
有问题的人#2008519有一个非常相似的要求.他对"TrustedByUs"功能的需求与我的相同.但是,他通过比较公钥来进行检查.虽然这可以在短期内起作用,但似乎它不适用于自动更新功能.这是因为代码签名证书最长有效期为2 - 3年.因此,在将来,当我们在2年内购买新证书时,由于公钥的更改,旧客户将无法再更新.
有没有办法以某种方式用特定用户的证书或AD凭证等以数字方式对数据库记录或特定字段的当前状态进行签名?我需要实现某种记录级别的批准,其中特定字段或字段或行的正确性和有效性由用户名/密码组合或某些证书签名.数据应始终在记录中可见,我所需要的只是能够告诉:谁和何时批准数据.我不需要阻止状态更改(锁定),只需要验证当前状态是否已签名.
目前我们已经开发出一个可以使用java applet对文档进行数字签名的系统.然而,由于禁止使用chrome,我们正在寻找替代数字签名解决方案.
目前签署的工作方式如下:
一种替代解决方案是在浏览器中导入证书并使用js进行签名.但这不是一个用户友好的解决方案.
另一个解决方案可能是要求用户使用JNLP下载运行程序,该程序下载并签署文档并使用HTTP多部分POST自动上载它.这种方法的缺点是它需要额外的用户交互(下载操作)而我们丢失浏览器http会话,因此我们必须再次进行身份验证.
哪个更可行?你能想到另类吗?
我正在尝试实施PDF的签名验证.这是一个很大的话题,所以我一步一步,首先我试图在我自己签名的PDF的情况下实际返回一个正面,使用当前Acrobat的所有默认值 - 应该是SHA256用于摘要,以及PKCS7分离签名.因此,我破解了openssl,并通过读取PDF中给出的字节范围并调用SHA256_*函数,我有一个哈希值来进行比较.所以现在我需要阅读证书数据等,并使用这些PKCS7_*功能.这个看起来是我想要的那个:
int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, BIO *indata, BIO *out, int flags);
Run Code Online (Sandbox Code Playgroud)
如文档中所示.除了上述文档没有告诉我如何构建任何这些东西.好吧,所以我认为BIO *indata可以使用这里的一些函数和使用这些函数的证书数组(尽管没有计算出精确的细节),但是PKCS7 *p7,或者被STACK_OF(x)调用的是什么.我找不到任何记录的初始化这些结构的方法.pkcs7.h标题中有一些pkcs7_ctrl函数: -
long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg);
int PKCS7_set_type(PKCS7 *p7, int type);
int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other);
int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data);
int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, const EVP_MD *dgst);
int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si);
int PKCS7_add_signer(PKCS7 *p7, …Run Code Online (Sandbox Code Playgroud) 我正在使用iText 5.5.3对PDF文档进行签名和加时间戳.它工作得很好.但我最近从Acrobat Pro X切换到XI,现在我看到了这个新行:
the signature is not LTV enabled and will expire after <date>
Run Code Online (Sandbox Code Playgroud)
我想这会警告我,在此日期之后,签名者的签名将被视为无效,对吧?但是签名属性告诉我:
the signature includes an embedded timestamp : <date/time>
signature was validated as of the secure timestamp time : <same date/time>
Run Code Online (Sandbox Code Playgroud)
现在我有点困惑:由于签名在已知且经过认证的日期被宣布有效,为什么它将来会变得无效?
如果我有一个不在机器的受信任根证书存储区中的自签名证书,如何在不将该证书添加到受信任的根存储区的情况下验证PE文件是否使用该证书进行了Authenticode签名?
C#是首选,但C++中的答案也很好.
StackOverflow上已经有很多类似的问题,但到目前为止还没有一个可以接受的答案.它必须是Authenticode,我无法将其添加到证书存储区.它也不能是购买的证书,因为它需要更长的有效时间(不论时间戳).
除了复制一大块Mono签名检查代码之外,我不知道Win32或.NET中的解决方案.
在Android APK的META-INF文件夹中MANIFEST.MF,CERT.SF和CERT.RSA文件的目的是什么?
我想使用 OpenSSL 和 RSA 算法用私钥加密文件:
openssl rsautl -in txt.txt -out txt2.txt -inkey private.pem -encrypt
Run Code Online (Sandbox Code Playgroud)
现在如果我进行解密操作:
openssl rsautl -in txt2.txt -pubin -inkey public.pem -decrypt
Run Code Online (Sandbox Code Playgroud)
此操作需要私钥
我知道我应该使用公钥来加密,如果我使用私钥,我就会得到签名。
但是,我想这样做是为了学习。
authenticode ×2
c ×2
cryptography ×2
android ×1
apk ×1
applet ×1
code-signing ×1
encryption ×1
itext ×1
java ×1
openssl ×1
pdf ×1
php ×1
pkcs#7 ×1
rsa ×1
ruby ×1
saml ×1
security ×1
self-signed ×1
signature ×1
sql-server ×1
windows ×1
xml ×1