• 关于

    x509证书 签名算法

    的搜索结果

问题

消息服务的Endpoint签名认证是什么?

用户可以通过推送请求Header中的 x-mns-signing-cert-url 获取签名证书,并根据相应的方法来验证该请求是否由MNS系统发出,防止恶意请求对用户造成负面影响。 在 MNS 推送请求的 He...
轩墨 2019-12-01 22:10:00 997 浏览量 回答数 0

问题

Android安全开发之通用签名风险

Android安全开发之通用签名风险 作者:伊樵、舟海、呆狐@阿里聚安全    1 通用签名风险简介 1.1 Android应用签名机制 阿里聚安全漏洞扫描器有一...
移动安全 2019-12-01 21:14:31 4210 浏览量 回答数 1

回答

=== 2018/8/30 16:00 终于搞定php对公钥证书签名 根据java SDK源码,用php取公钥证书SN如下: $p = []; $str = file_get_contents('./alipayRootCert.crt'); $p["alipay_root_cert_sn"] = getRootCertSN($str); $str = file_get_contents('./alipayCertPublicKey_RSA2.crt'); $p["alipay_cert_sn"] = getCertSN($str); $str = file_get_contents('./appCertPublicKey.crt'); $p["app_cert_sn"] = getCertSN($str); var_export($p); function getRootCertSN($str) { $arr = preg_split('/(?=-----BEGIN)/', $str, -1, PREG_SPLIT_NO_EMPTY); $str = null; foreach ($arr as $e) { $sn = getCertSN($e, true); if (!$sn) continue; if ($str === null) $str = $sn; else $str .= "_" . $sn; } return $str; } function getCertSN($str, $matchAlgo=false) { /* 根据java SDK源码:AntCertificationUtil::getRootCertSN 对证书链中RSA的项目进行过滤(猜测是gm国密算法java抛错搞不定,故意略去) java源码为: if(c.getSigAlgOID().startsWith("1.2.840.113549.1.1")) 根据 https://www.alvestrand.no/objectid/1.2.840.113549.1.1.html 该OID为RSA算法系。 */ if ($matchAlgo) { openssl_x509_export($str, $out, false); if (!preg_match('/Signature Algorithm:.*?RSA/im', $out, $m)) return; } $a = openssl_x509_parse($str); $issuer = null; // 注意:根据java代码输出,需要倒着排列 CN,OU,O foreach ($a["issuer"] as $k=>$v) { if ($issuer === null) { $issuer = "$k=$v"; } else { $issuer = "$k=$v," . $issuer; } } # echo($issuer . $a["serialNumber"] . "\n"); $sn = md5($issuer . $a["serialNumber"]); return $sn; } 做为首批踩坑者,只能长叹一声 === 2018/8/30 12:15 更新: 名字和序列化取出来像这样: CN=Ant Financial Certification Authority Class 2 R1,OU=Certification Authority,O=Ant Financial,C=CN 42665268812499181166312682537244063920 名字各段之间用逗号分隔,没有额外的空格序列号是10进制数,不是16进制,也没有任何分隔符取根证书sn需要遍历其中所有证书链,分别对name+serial进行md5编码,再用"_"连接起来。 看了半天java源码,终于运行起来,把sn值打出来了,拷贝到php中,终于看到手机上支付页面出来了。结果大致像这样: "app_cert_sn" => "06de145e15a73a8ce87f3eefeddce8b2", //"alipay_cert_sn" => "b1a855128d973b1ff1b1609bbce77fe0", "alipay_root_cert_sn" => "687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6" 支付宝根证书要用特殊方法来取(源码里用AntCertificationUtil.getRootCertSN),怪不得之前写的不行。 定此接口的人需要深刻检讨,竟然直接以java语言的某个输出来定接口规范。难怪php或其它语言的相关sdk没有出来,我感觉也不好写。 ============ 旧消息 新申请的开放平台帐号,被强制使用了公钥证书签名。 !!!下面开始吐槽: 首先是接口文档比如 https://docs.open.alipay.com/api_1/alipay.trade.app.pay 中完全没提到有公钥证书签名这回事。 调用支付出问题后(报错总是报“支付取消”??),四处查文档,才找到php SDK没有提供此功能,于是决定按接口文档来写。 签名算法的文档中介绍是这样介绍算法的: “SN值是通过解析X.509证书文件中签发机构名称(name)以及内置序列号(serialNumber),将二者拼接后的字符串计算MD5值获取” 尼码,文档完全没有介绍name和serialNumber分别是怎样的文本格式?也没有例子。 我试了name是 “ROOTCA”,“/C=CN/O=NRCAC/CN=ROOTCA”,“C=CN, O=NRCAC, CN=ROOTCA”各种格式,而serialNumber格式我试了 “69e2fec0170ac67b”以及加"69 e2..."、加“69:e2..."等,以及各种组合,都没有验签成功。 于是走第二条路,找它说的java SDK源码来参考。打开java sdk链接,是在maven上的,找了好久才搜到了新版本java源码。 终于找到了介绍的getCertSN函数,其核心是这样实现的: public static String getCertSN(String certPath)throws AlipayApiException{ InputStream inputStream = null; inputStream = new FileInputStream(certPath); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate)cf.generateCertificate(inputStream); MessageDigest md = MessageDigest.getInstance("MD5"); md.update((cert.getIssuerX500Principal().getName()+cert.getSerialNumber()).getBytes()); String certSN = new BigInteger(1,md.digest()).toString(16); //BigInteger会把0省略掉,需补全至32位 certSN = fillMD5(certSN); return certSN; 于是找这cert.getIssuerX500Principal().getName()+cert.getSerialNumber()文档 实在看不懂,算了,还是直接运行这段java代码吧,把结果复制到php中填参数也可以,眼看就要成功了,结果运行java是这样的: java.security.cert.CertificateParsingException: java.io.IOException: Unknown named curve: 1.2.156.10197.1.301 at sun.security.x509.X509CertInfo.<init>(Unknown Source) at sun.security.x509.X509CertImpl.parse(Unknown Source) at sun.security.x509.X509CertImpl.<init>(Unknown Source) at sun.security.provider.X509Factory.engineGenerateCertificate(Unknown Source) at java.security.cert.CertificateFactory.generateCertificate(Unknown Source) at j1.getCertSN(j1.java:33) at j1.main(j1.java:24) 搜索发现,是java不支持国密算法。。。(https://cloud.tencent.com/info/fcfae2f8bd49fcce8737c7485afcdf29.html)
天笑2001 2019-12-02 02:09:44 0 浏览量 回答数 0

回答

数字签名算法分析与Hash签名 序:这篇文章我用了近一周的时间完成,其中涉及到的RSA算法已经在上一篇《公钥密码体系》中详细的介绍过,目前数字签名中人们使用很多的还是512位与1024位的RSA算法。 摘要: 数字签字和认证机构是电子商务的核心技术。数字签名作为目前Internet中电子商务重要的技术,不断地进行改进,标准化。本文从数字签名的意义出发,详细介绍了数字签名中涉及到的内容与算法,并自行结合进行改进。 关键词:Internet 公钥加密 Hash函数 电子商务 加密 数字签名 数字签名简介 我们对加解密算法已经有了一定理解,可以进一步讨论"数字签名"(注意不要与数字认证混淆)的问题了,即如何给一个计算机文件进行签字。数字签字可以用对称算法实现,也可以用公钥算法实现。但前者除了文件签字者和文件接受者双方,还需要第三方认证,较麻烦;通过公钥加密算法的实现方法,由于用秘密密钥加密的文件,需要靠公开密钥来解密,因此这可以作为数字签名,签名者用秘密密钥加密一个签名(可以包括姓名、证件号码、短信息等信息),接收人可以用公开的、自己的公开密钥来解密,如果成功,就能确保信息来自该公开密钥的所有人。 公钥密码体制实现数字签名的基本原理很简单,假设A要发送一个电子文件给B,A、B双方只需经过下面三个步骤即可: 1. A用其私钥加密文件,这便是签字过程 2. A将加密的文件送到B 3. B用A的公钥解开A送来的文件 这样的签名方法是符合可靠性原则的。即: 签字是可以被确认的, 签字是无法被伪造的, 签字是无法重复使用的, 文件被签字以后是无法被篡改的, 签字具有无可否认性, 数字签名就是通过一个单向函数对要传送的报文进行处理得到的用以认证报文来源并核实报文是否发生变化的一个字母数字串。用这几个字符串来代替书写签名或印章,起到与书写签名或印章同样的法律效用。国际社会已开始制定相应的法律、法规,把数字签名作为执法的依据。 数字签名的实现方法 实现数字签名有很多方法,目前数字签名采用较多的是公钥加密技术,如基于RSA Data Security公司的PKCS(Public Key Cryptography Standards)、DSA(Digital Signature Algorithm)、x.509、PGP(Pretty Good Privacy)。1994年美国标准与技术协会公布了数字签名标准(DSS)而使公钥加密技术广泛应用。同时应用散列算法(Hash)也是实现数字签名的一种方法。 非对称密钥密码算法进行数字签名 算法的含义: 非对称密钥密码算法使用两个密钥:公开密钥和私有密钥,分别用于对数据的加密和解密,即如果用公开密钥对数据进行加密,只有用对应的私有密钥才能进行解密;如果用私有密钥对数据进行加密,则只有用对应的公开密钥才能解密。 使用公钥密码算法进行数字签名通用的加密标准有: RSA,DSA,Diffie-Hellman等。 签名和验证过程: 发送方(甲)首先用公开的单向函数对报文进行一次变换,得到数字签名,然后利用私有密钥对数字签名进行加密后附在报文之后一同发出。 接收方(乙)用发送方的公开密钥对数字签名进行解密交换,得到一个数字签名的明文。发送方的公钥可以由一个可信赖的技术管理机构即认证中心(CA)发布的。 ------------------------------------------------ 数字信封 这是去年十月份完成的一个练习程序: 一.原理: 用快速的对称密钥加密大量数据,然后仅仅对对称密钥作RSA加密,将对称加密后的密文和RSA加密的对称密钥发给接收方。 有效解决了: 1. PKCS#1填充方案的长度限制问题 RSA密钥长度(bit) 加密上限(byte) 1024 117 2048 245 2. RSA加密大量数据的耗时问题 二.开发: 数字信封原理简单,而且综合应用了上面提到的对称加密、非对称加密算法。对于加密算法的学习,数字信封程序是个不错的入门题材。 (1)库文件概要: clsAES.dll DESCRIPTION:AES对称算法库文件 NAMESPACE:nsAES CLASS:clsAES MEMBERS: Methods: public byte[] AESdecrypt ( System.String encryptedtext ) public byte[] AESencrypt ( System.String plaintext ) public void GenKeyIV ( ) Constructors: public clsAES ( byte[] key , byte[] IV ) public clsAES ( ) Property variables: public byte[] key public byte[] IV AESdecrypt 和AESencrypt是实现对称加密解密的方法; GenKeyIV方法生成对称密钥的密钥值和初始向量(IV:Initial Vector); 成员变量key和IV存放对称密钥的密钥值和初始向量 csRSA.dll DESCRIPTION:RSA非对称算法库文件 NAMESPACE:nsRSA CLASS:clsRSA MEMBERS: Methods: public string strEnc(System.String strToEncrypt) public string strDec(System.String strToDecrypt) public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) Constructors: public clsRSA ( ) Variable: RSACryptoServiceProvider RSA strEnc 和strDec是实现非对称加密和解密的方法,由RSA提供加密和解密的服务。 RSAEncrypt和RSADecrypt也是实现非对称加密解密的方法,必须通过RSAKeyInfo传入RSA密钥参数。 成员变量RSA保存RSA加密服务的一个实例。 clsRsaKeyMgr.dll( RSA Key Management) DESCRIPTION:RSA非对称算法密钥管理库文件 NAMESPACE:nsRsaKeyMgr CLASS:clsRsaKeyMgr MEMBERS: Methods: public void CreatePublicKeyFile(System.String ContainerName, System.String OutputFileName) public void CreatePrivateKeyFile(System.String ContainerName, System.String OutputFileName) public RSAParameters GetPublicKeyFromFile(System.String InputFileName) public RSAParameters GetPrivateKeyFromFile(System.String InputFileName) public void GenKey_SaveInContainer(System.String ContainerName) public string GetKeyFromContainer(System.String ContainerName,bool IsFullKey) public void DeleteKeyFromContainer(System.String ContainerName) Constructors: public clsRsaKeyMgr ( ) CreatePublicKeyFile和 CreatePrivateKeyFile分别从密钥容器中创建公钥和密钥并写入到指定的文件中。 GetPublicKeyFromFile和GetPrivateKeyFromFile分别从文件中获取公钥和密钥,返回RSAParameters类型的RSA参数结构体。 GenKey_SaveInContainer在指定名称的密钥容器中创建密钥。 GetKeyFromContainer从指定名称的密钥容器中获取XML格式的密钥信息。 DeleteKeyFromContainer删除指定的密钥容器。 -------------------------------------------------- 双重签名 1996年2月1日MasterCard 与Visa两大国际信用卡组织与技术合作伙伴GTE、Netscape、IBM、Terisa Systems、Verisign、Microsoft、SAIC等一批跨国公司共同开发了安全电子交易规范(Secure Electronic Transaction,简称SET)。SET是一种应用于开放网络环境下,以信用卡为基础的安全电子支付系统的协议,它给出了一套电子交易的过程规范。通过SET这一套完备的安全电子交易协议可以实现电子商务交易中的加密、认证机制、密钥管理机制等,保证在开放网络上使用信用卡进行在线购物的安全。由于SET提供商家和收单银行的认证,确保了交易数据的安全、完整可靠和交易的不可抵赖性,特别是具有保护消费者信用卡号不暴露给商家等优点,因此它成为目前公认的信用卡/借记卡的网上交易的国际标准。 SET协议采用了对称密钥和非对称密钥体制,把对称密钥的快速、低成本和非对称密钥的有效性结合在一起,以保护在开放网络上传输的个人信息,保证交易信息的隐蔽性。其重点是如何确保商家和消费者的身份和行为的认证和不可抵赖性,其理论基础是著名的非否认协议 (Non-repudiation),其采用的核心技术包括X。509电子证书标准与数字签名技术(Digital Signature)、报文摘要、数字信封、双重签名等技术。如使用数字证书对交易各方的合法性进行验证;使用数字签名技术确保数据完整性和不可否认;使用双重签名技术对SET交易过程中消费者的支付信息和定单信息分别签名,使得商家看不到支付信息,只能对用户的订单信息解密,而金融机构只能对支付和账户信息解密,充分保证消费者的账户和定货信息的安全性。 SET通过制定标准和采用各种技术手段,解决了一直困扰电子商务发展的安全问题,包括购物与支付信息的保密性、交易支付完整性、身份认证和不可抵赖性,在电子交易环节上提供了更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。-------------------------这个问题找不到吧,我想你应该自己收集的,不一定百度全知道,如果没人回答,建议找找一个一个的原理。-------------------------这东西好象不应该在这里解决的啊 你到操作系统那里 有高手的
小哇 2019-12-02 01:26:37 0 浏览量 回答数 0

回答

步骤一:准备服务器证书 服务器证书用于用户浏览器检查服务器发送的证书是否是由自己信赖的中心签发的,服务器证书可以到阿里云云盾证书服务购买,也可以到其他服务商处购买。 步骤二:使用OpenSSL生成CA证书 运行以下命令在/root目录下新建一个ca文件夹,并在ca文件夹下创建四个子文件夹。 $ sudo mkdir ca $ cd ca $ sudo mkdir newcerts private conf server 其中: newcerts目录:用于存放CA签署过的数字证书(证书备份目录)。 private目录:用于存放CA的私钥。 conf目录:用于存放一些简化参数用的配置文件。 server目录:存放服务器证书文件。 在conf目录下新建一个包含如下信息的openssl.conf文件。 [ ca ] default_ca = foo [ foo ] dir = /root/ca database = /root/ca/index.txt new_certs_dir = /root/ca/newcerts certificate = /root/ca/private/ca.crt serial = /root/ca/serial private_key = /root/ca/private/ca.key RANDFILE = /root/ca/private/.rand default_days = 365 default_crl_days= 30 default_md = md5 unique_subject = no policy = policy_any [ policy_any ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = match localityName = optional commonName = supplied emailAddress = optional 运行以下命令生成私钥key文件。 $ cd /root/ca $ sudo openssl genrsa -out private/ca.key 运行结果如下图所示。 运行以下命令并按命令后的示例提供需要输入的信息,然后回车,生成证书请求csr文件。 $ sudo openssl req -new -key private/ca.key -out private/ca.csr 说明 Common Name请输入您的负载均衡服务的域名。 运行以下命令生成凭证crt文件。 $ sudo openssl x509 -req -days 365 -in private/ca.csr -signkey private/ca.key -out private/ca.crt 运行以下命令为CA的key设置起始序列号,可以是任意四个字符。 $ sudo echo FACE > serial 运行以下命令创建CA键库。 $ sudo touch index.txt 运行以下命令为移除客户端证书创建一个证书撤销列表。 $ sudo openssl ca -gencrl -out /root/ca/private/ca.crl -crldays 7 -config "/root/ca/conf/openssl.conf" 输出为: Using configuration from /root/ca/conf/openssl.conf 步骤三:生成客户端证书 运行以下命令在ca目录内创建一个存放客户端key的目录users。 $ sudo mkdir users 运行以下命令为客户端创建一个key: $ sudo openssl genrsa -des3 -out /root/ca/users/client.key 1024 说明 创建key时要求输入pass phrase,这是当前key的口令,以防止本密钥泄漏后被人盗用。两次输入同一个密码。 运行以下命令为客户端key创建一个证书签名请求csr文件。 $ sudo openssl req -new -key /root/ca/users/client.key -out /root/ca/users/client.csr 输入该命令后,根据提示输入上一步输入的pass phrase,然后根据提示,提供对应的信息。 说明 A challenge password是客户端证书口令(请注意将它和client.key的口令区分开,本教程设置密码为test),可以与服务器端证书或者根证书口令一致。 运行以下命令使用步骤二中的CA Key为刚才的客户端key签名。 $ sudo openssl ca -in /root/ca/users/client.csr -cert /root/ca/private/ca.crt -keyfile /root/ca/private/ca.key -out /root/ca/users/client.crt -config "/root/ca/conf/openssl.conf" 当出现确认是否签名的提示时,两次都输入y。 运行以下命令将证书转换为大多数浏览器都能识别的PKCS12文件。 $ sudo openssl pkcs12 -export -clcerts -in /root/ca/users/client.crt -inkey /root/ca/users/client.key -out /root/ca/users/client.p12 按照提示输入客户端client.key的pass phrase。 再输入用于导出证书的密码。这个是客户端证书的保护密码,在安装客户端证书时需要输入这个密码。 运行以下命令查看生成的客户端证书。 cd users ls 步骤四:上传服务器证书和CA证书 登录负载均衡管理控制台。 在实例管理页面,单击创建负载均衡。 配置负载均衡实例,单击立即购买完成支付。 本操作中网络类型选择公网,地域选择华东1(杭州),详细配置信息请参见创建负载均衡实例。 创建成功后,在实例管理页面,将鼠标移至实例名称区域,单击出现的铅笔图标,修改负载均衡实例名称。 在选左侧导航栏,单击证书管理页签。 单击创建证书。 在创建证书页面,完成如下配置后,单击确定。 证书部署地域:本教程中选择华东1。 说明 证书的地域和负载均衡实例的地域要相同。 证书类型:选择服务器证书。 证书内容和私钥:复制您的服务器证书内容和私钥。 说明 在复制内容前,您可以单击导入样式,查看正确的证书和私钥格式。更多详细信息请参见证书要求。 在负载均衡左侧导航栏,单击证书管理,然后单击创建证书,上传CA证书。 在创建证书页面,完成如下配置后,单击确定。 证书部署地域:本教程中选择华东1(杭州)。 说明 证书的地域和负载均衡实例的地域要相同。 证书类型:选择CA证书。 证书内容:复制您的CA证书内容。 说明 在复制内容前,您可以单击导入样式,查看正确的证书和私钥格式。更多详细信息请参见证书要求。 步骤五:安装客户端证书 将生成的客户端证书安装到客户端。本教程以Windows客户端,IE浏览器为例。 打开Git Bash命令行窗口,运行以下命令导出步骤三中生成的客户端证书。 scp root@IPaddress:/root/ca/users/client.p12 ./ 说明 IPaddress是生成客户端证书的服务器的IP地址。 在IE浏览器中导入下载的客户端证书。 打开IE浏览器,单击设置 > Internet选项。 单击内容页签,然后单击证书,导入下载的客户端证书。在导入证书时需要输入在步骤三时生成PKCS12文件的密码。 步骤六:配置HTTPS双向认证监听 登录负载均衡管理控制台。 选择华东1(杭州)地域,单击已创建的负载均衡实例ID链接,或者单击监听配置向导。 选择监听页签,单击添加监听。 在协议&监听页签下,配置监听。 选择负载均衡协议:HTTPS 监听端口:443 调度算法:轮询(RR) 单击下一步,在SSL证书页签下,配置SSL证书信息,启用双向认证。 服务器证书:选择已上传的服务器证书。 CA证书: 选择已上传的CA证书。 单击下一步,选择默认服务器组页签,单击添加,添加ECS服务器,并将后端协议端口设置为80。 单击下一步,开启健康检查。 单击下一步,查看监听配置信息。 单击提交,提交审核。 单击确定。 步骤七:测试HTTPS双向认证 在实例管理页面,查看健康检查状态。当状态为正常时,表示后端服务器可以正常接收处理负载均衡监听转发的请求。 在浏览器中,输入负载均衡的公网服务地址,当提示是否信任客户端证书时,选择信任。 刷新浏览器,您可以观察到请求在两台ECS服务器之间转换。
保持可爱mmm 2020-03-29 11:47:39 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT