- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我为 HTTPS 代理编写了一个供应系统。在推送配置文件并上传证书和私钥之前,我做了一些验证。我发现了一个案例,当 Java 使用 PemReader OpenSSL 验证私钥时,不会验证同一个文件。这会导致 httpd 服务器停止工作,因为它获得了错误的 key 。
我已经做了一个重现它的测试:
使用 openssl 我有一个错误
$ openssl rsa -in wrong_key_test.key -check
unable to load Private Key
140736227525512:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/pem/pem_lib.c:828:
但是当我运行这个 junit 测试时一切正常。我的期望是有一个异常(exception),你知道吗?是我的验证错误吗?
这是junit
package eu.ssl.test.validator;
import static org.junit.Assert.assertNotEquals;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.security.KeyFactory;
import java.security.Security;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import org.apache.commons.io.FileUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader;
import org.junit.Before;
import org.junit.Test;
public class PemReaderTest {
private String privateKey;
@Before
public void setUp() throws IOException {
this.privateKey = FileUtils.readFileToString(new File("./wrong_key_test.key"));
}
@Test
public void test() throws Exception {
Security.addProvider(new BouncyCastleProvider());
PemReader pemReader = new PemReader(new StringReader(this.privateKey));
PemObject pemObject;
try {
pemObject = pemReader.readPemObject();
} finally {
pemReader.close();
}
KeyFactory factory = KeyFactory.getInstance("RSA");
byte[] content = pemObject.getContent();
PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(content);
RSAPrivateKey privateKey = (RSAPrivateKey) factory.generatePrivate(privKeySpec);
String privateKeyModulus = privateKey.getModulus().toString();
assertNotEquals("", privateKeyModulus);
}
}
这就是PK
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2lKPRVgFN8TfOhex+IJ6YMKUKeZgHZUGsJpHo/ipeYVeWUGa
jKVANloG3IX/I5Zo8FZ6R6BVCEisaGqH35HwktZ+vdrGzuRNGUERnZiy1nXzKDmV
CGdBY/PxErvvEyygHPd8X9HNGagjOlKLrPGyN2dAp6sMpljNevSzbXYxCX0KOm9z
ox40c2qdXFqa26mUWKVVZ6TdYSIeV1s/n3oRvAA3fbFAdTg4xM++g/V8LXyipDK4
gEqNPwJzzvE6u0P0u+MFCEgogbVZLVelLq6OzTU27pigwourVAf8eWyRYX8TOz2E
A1HDDKy7dSwTaIz7TPXfYqwe+bwLEl5vX/dQ6QIDAQABAoIBADBPcJChp5XtpI/Q
Snt5M+dRZ0PWTJJ/NZnCqfOoxKe1UWli0PYqYwkj5rzJkemoENSN7kUHP4mzuyLn
3+UjAB8eA7GzRabmcgESmvlKnthCBWpzQ302jAu4ITJKD98oUs3WHdl+LWpuAE2Z
knrUiOElofL4MLZmlCGPIF0qeDNm5QkLanMyzu7bduo8etwn2NNBHxDdc4eW2c2l
d4m1INObx4ZyAkoBWksKN8PsDH2I3FZJFvkgve1fFhff0U+CtertfOwlFoAmDv9j
FtJq2Y6H2p+Q1eyRlh0OLAK7qZ5MhgBOMe3PNxeJWa3S4Z/gevihweclmK/F9e9T
/V5JVgECgYEA/W6eKy2cgkajjgBPu4tsW8XTo9lyWnWLYUY2PacgfhT7zkZy4s4g
cfP1zjjGXZaDYgo7MPoBM0xFLYbrWQ7j8GgA18uTHZs2yjYya1a6iyi8RMdQpRzd
jzCDfHNeJ2YU1apVuqs8r99sskkg/S2gd31XCuKwYTgCVgi4GmczUiECgYEA3Ije
0F/Ojb7dV35w0K+NK6rl/RL42cDcy5qjEAlI5zUcbxubjy+gHwCBM6dwx8frIeaX
BG512loqoALKXvLzSUAWbnPsvkQCOkcBPvi48tkWh3h1QO1S1U38KrWr58+9WCLs
5tL14l8O8JQmNg/0jLA4k3OHhL/gy6VQGolLNckCgYB5T9kgnA2+AqhJ0fZYtO2i
pHihhvYJPRkB8EUIkBaqo8rBO9HEpZy8T2ZLV7wEkobDiFg7IoEumATJPTss/0a3
DmHQ6l66nlDEzNqnrPVQpagxWCNPVhjscPGPwf3A6Ely2b19xHghS9bRJNZIuu2E
JRhkWozJjLD5k+Tkpp/XYQKBgDiv/gY1+lQ5MZAh8kHSPklxPnkU/V6L0rWLZErk
+BZmco6k3BGsPk55xLxQWA8idnBaY4tCEY01DCvhS7+oV50Gmj1+Eua9eI0eX1We
fXv/DWl5LzqnRlmKGD2qQSvvHE6he5/Brm6n3KE+k6vl4gif64sLcVRQNipirfqE
PA7xAoGBAJ8wfxLaj86/f+JU2jAd34HYZpNQ1mEb2TqZkrLqk78VXaKhyZjw2IGe
Pt5ROLZNIQbVWcTSMD2TrDsZGDY5zq5hXnRXb2h1Q1PHbbixl0s3TnDZ0JGxxrLQ
iAc48q1o36aAYVSyY/JLR3Q9Su97+i55Ud5rDYW5ThLcACsjxB/mL
-----END RSA PRIVATE KEY-----
提前致谢尼古拉
最佳答案
My expectation was to have an exception , have you any idea about it? Is it my validation wrong?
key 格式错误。首先,保存 PEM 编码的 key :
echo '-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2lKPRVgFN8TfOhex+IJ6YMKUKeZgHZUGsJpHo/ipeYVeWUGa
...
iAc48q1o36aAYVSyY/JLR3Q9Su97+i55Ud5rDYW5ThLcACsjxB/mL
-----END RSA PRIVATE KEY-----' > key.pem
其次,将其转换为 DER。这将去除第一行和最后一行,然后进行 base64 解码:
sed '$d' < key.pem | sed "1d" | openssl base64 -d > key.der
第三,用另一个工具检查 key :
$ dumpasn1 key.der
0 1187: SEQUENCE {
4 1: INTEGER 0
7 257: INTEGER
: 00 DA 52 8F 45 58 05 37 C4 DF 3A 17 B1 F8 82 7A
: 60 C2 94 29 E6 60 1D 95 06 B0 9A 47 A3 F8 A9 79
: 85 5E 59 41 9A 8C A5 40 36 5A 06 DC 85 FF 23 96
: 68 F0 56 7A 47 A0 55 08 48 AC 68 6A 87 DF 91 F0
: 92 D6 7E BD DA C6 CE E4 4D 19 41 11 9D 98 B2 D6
: 75 F3 28 39 95 08 67 41 63 F3 F1 12 BB EF 13 2C
: A0 1C F7 7C 5F D1 CD 19 A8 23 3A 52 8B AC F1 B2
: 37 67 40 A7 AB 0C A6 58 CD 7A F4 B3 6D 76 31 09
: [ Another 129 bytes skipped ]
268 3: INTEGER 65537
273 256: INTEGER
: 30 4F 70 90 A1 A7 95 ED A4 8F D0 4A 7B 79 33 E7
: 51 67 43 D6 4C 92 7F 35 99 C2 A9 F3 A8 C4 A7 B5
: 51 69 62 D0 F6 2A 63 09 23 E6 BC C9 91 E9 A8 10
: D4 8D EE 45 07 3F 89 B3 BB 22 E7 DF E5 23 00 1F
: 1E 03 B1 B3 45 A6 E6 72 01 12 9A F9 4A 9E D8 42
: 05 6A 73 43 7D 36 8C 0B B8 21 32 4A 0F DF 28 52
: CD D6 1D D9 7E 2D 6A 6E 00 4D 99 92 7A D4 88 E1
: 25 A1 F2 F8 30 B6 66 94 21 8F 20 5D 2A 78 33 66
: [ Another 128 bytes skipped ]
533 129: INTEGER
: 00 FD 6E 9E 2B 2D 9C 82 46 A3 8E 00 4F BB 8B 6C
: 5B C5 D3 A3 D9 72 5A 75 8B 61 46 36 3D A7 20 7E
: 14 FB CE 46 72 E2 CE 20 71 F3 F5 CE 38 C6 5D 96
: 83 62 0A 3B 30 FA 01 33 4C 45 2D 86 EB 59 0E E3
: F0 68 00 D7 CB 93 1D 9B 36 CA 36 32 6B 56 BA 8B
: 28 BC 44 C7 50 A5 1C DD 8F 30 83 7C 73 5E 27 66
: 14 D5 AA 55 BA AB 3C AF DF 6C B2 49 20 FD 2D A0
: 77 7D 57 0A E2 B0 61 38 02 56 08 B8 1A 67 33 52
: 21
665 129: INTEGER
: 00 DC 88 DE D0 5F CE 8D BE DD 57 7E 70 D0 AF 8D
: 2B AA E5 FD 12 F8 D9 C0 DC CB 9A A3 10 09 48 E7
: 35 1C 6F 1B 9B 8F 2F A0 1F 00 81 33 A7 70 C7 C7
: EB 21 E6 97 04 6E 75 DA 5A 2A A0 02 CA 5E F2 F3
: 49 40 16 6E 73 EC BE 44 02 3A 47 01 3E F8 B8 F2
: D9 16 87 78 75 40 ED 52 D5 4D FC 2A B5 AB E7 CF
: BD 58 22 EC E6 D2 F5 E2 5F 0E F0 94 26 36 0F F4
: 8C B0 38 93 73 87 84 BF E0 CB A5 50 1A 89 4B 35
: C9
797 128: INTEGER
: 79 4F D9 20 9C 0D BE 02 A8 49 D1 F6 58 B4 ED A2
: A4 78 A1 86 F6 09 3D 19 01 F0 45 08 90 16 AA A3
: CA C1 3B D1 C4 A5 9C BC 4F 66 4B 57 BC 04 92 86
: C3 88 58 3B 22 81 2E 98 04 C9 3D 3B 2C FF 46 B7
: 0E 61 D0 EA 5E BA 9E 50 C4 CC DA A7 AC F5 50 A5
: A8 31 58 23 4F 56 18 EC 70 F1 8F C1 FD C0 E8 49
: 72 D9 BD 7D C4 78 21 4B D6 D1 24 D6 48 BA ED 84
: 25 18 64 5A 8C C9 8C B0 F9 93 E4 E4 A6 9F D7 61
928 128: INTEGER
: 38 AF FE 06 35 FA 54 39 31 90 21 F2 41 D2 3E 49
: 71 3E 79 14 FD 5E 8B D2 B5 8B 64 4A E4 F8 16 66
: 72 8E A4 DC 11 AC 3E 4E 79 C4 BC 50 58 0F 22 76
: 70 5A 63 8B 42 11 8D 35 0C 2B E1 4B BF A8 57 9D
: 06 9A 3D 7E 12 E6 BD 78 8D 1E 5F 55 9E 7D 7B FF
: 0D 69 79 2F 3A A7 46 59 8A 18 3D AA 41 2B EF 1C
: 4E A1 7B 9F C1 AE 6E A7 DC A1 3E 93 AB E5 E2 08
: 9F EB 8B 0B 71 54 50 36 2A 62 AD FA 84 3C 0E F1
1059 129: INTEGER
: 00 9F 30 7F 12 DA 8F CE BF 7F E2 54 DA 30 1D DF
: 81 D8 66 93 50 D6 61 1B D9 3A 99 92 B2 EA 93 BF
: 15 5D A2 A1 C9 98 F0 D8 81 9E 3E DE 51 38 B6 4D
: 21 06 D5 59 C4 D2 30 3D 93 AC 3B 19 18 36 39 CE
: AE 61 5E 74 57 6F 68 75 43 53 C7 6D B8 B1 97 4B
: 37 4E 70 D9 D0 91 B1 C6 B2 D0
: Error: Unexpected EOF, 39 bytes missing.
Error: Inconsistent object length, 39 bytes difference.
: }
Error: Inconsistent object length, 38 bytes difference.
0 warnings, 3 errors.
当您查看从字节 0 开始的第一个 ASN.1 序列时:
0 1187: SEQUENCE
该序列应该有 1187 个内容八位字节。但这是不可能的,因为文件中只有 1152 字节:
$ ls -Al key.pem key.der
-rw-rw-r--. 1 jwalton jwalton 1152 Jan 31 19:49 key.der
-rw-rw-r--. 1 jwalton jwalton 1676 Jan 31 19:41 key.pem
关于java - 使用 PemReader 和 Openssl 解析私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48552294/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!