在这篇文章中,我们将为您详细介绍以编程方式从PEM获取KeyStore的内容,并且讨论关于编写程序,使用pickle模块将包含学生成绩的相关问题。此外,我们还会涉及一些关于android–以编程方式从
在这篇文章中,我们将为您详细介绍以编程方式从PEM获取KeyStore的内容,并且讨论关于编写程序,使用pickle模块将包含学生成绩的相关问题。此外,我们还会涉及一些关于android – 以编程方式从google play store下载APK、android – 如何以编程方式从设备获取System On Chip数据、Android 获取keystore SHA1方法、Babylonjs -- 如何以编程方式获取 Inspector 信息?的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 以编程方式从PEM获取KeyStore(编写程序,使用pickle模块将包含学生成绩)
- android – 以编程方式从google play store下载APK
- android – 如何以编程方式从设备获取System On Chip数据
- Android 获取keystore SHA1方法
- Babylonjs -- 如何以编程方式获取 Inspector 信息?
以编程方式从PEM获取KeyStore(编写程序,使用pickle模块将包含学生成绩)
如何从包含证书和私钥的PEM文件中以编程方式获取KeyStore?我试图在HTTPS连接中向服务器提供客户端证书。我已经确认,如果我使用openssl和keytool来获取jks文件(该文件是动态加载的),则客户端证书可以使用。我什至可以通过动态读取p12(PKCS12)文件来使其工作。
我正在考虑使用BouncyCastle的PEMReader类,但无法克服一些错误。我正在使用-Djavax.net.debug =
all选项运行Java客户端,并通过调试LogLevel运行Apache Web服务器。我不确定该寻找什么。Apache错误日志指示:
...OpenSSL: Write: SSLv3 read client certificate BOpenSSL: Exit: error in SSLv3 read client certificate BRe-negotiation handshake failed: Not accepted by client!?
Java客户端程序指示:
...main, WRITE: TLSv1 Handshake, length = 48main, waiting for close_notify or alert: state 3main, Exception while waiting for close java.net.SocketException: Software caused connection abort: recv failedmain, handling exception: java.net.SocketException: Software caused connection abort: recv failed%% Invalidated: [Session-3, TLS_RSA_WITH_AES_128_CBC_SHA]main, SEND TLSv1 ALERT: fatal, description = unexpected_message...
客户端代码:
public void testClientCertPEM() throws Exception { String requestURL = "https://mydomain/authtest"; String pemPath = "C:/Users/myusername/Desktop/client.pem"; HttpsURLConnection con; URL url = new URL(requestURL); con = (HttpsURLConnection) url.openConnection(); con.setSSLSocketFactory(getSocketFactoryFromPEM(pemPath)); con.setRequestMethod("GET"); con.setDoInput(true); con.setDoOutput(false); con.connect(); String line; BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); while((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); con.disconnect();}public SSLSocketFactory getSocketFactoryFromPEM(String pemPath) throws Exception { Security.addProvider(new BouncyCastleProvider()); SSLContext context = SSLContext.getInstance("TLS"); PEMReader reader = new PEMReader(new FileReader(pemPath)); X509Certificate cert = (X509Certificate) reader.readObject(); KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(null); keystore.setCertificateEntry("alias", cert); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(keystore, null); KeyManager[] km = kmf.getKeyManagers(); context.init(km, null, null); return context.getSocketFactory();}
我注意到服务器在客户端TLSv1中正在日志中输出SSLv3。如果我添加系统属性-Dhttps.protocols =
SSLv3,则客户端也将使用SSLv3,但是会收到相同的错误消息。我还尝试添加-
Dsun.security.ssl.allowUnsafeRenegotiation = true,但结果没有变化。
我已经四处搜寻,这个问题的通常答案是先使用openssl和keytool。就我而言,我需要即时阅读PEM。实际上,我正在移植已经执行此操作的C
程序,坦率地说,我很惊讶在Java中执行此操作有多么困难。C 代码:
curlpp::Easy request; ... request.setOpt(new Options::Url(myurl)); request.setOpt(new Options::SslVerifyPeer(false)); request.setOpt(new Options::SslCertType("PEM")); request.setOpt(new Options::SslCert(cert)); request.perform();
答案1
小编典典我想到了。问题在于X509证书本身是不够的。我还需要将私钥放入动态生成的密钥库中。看来BouncyCastle
PEMReader不能一次性处理带有证书和私钥的PEM文件,但它可以分别处理每个文件。我可以自己将PEM读取到内存中,并将其分成两个单独的流,然后将每个输入到一个单独的PEMReader。因为我知道我要处理的PEM文件将首先具有证书,然后具有私钥,所以我可以以健壮性为代价来简化代码。我也知道END
CERTIFICATE分隔符将始终被五个连字符包围。对我有用的实现是:
protected static SSLSocketFactory getSocketFactoryPEM(String pemPath) throws Exception { Security.addProvider(new BouncyCastleProvider()); SSLContext context = SSLContext.getInstance("TLS"); byte[] certAndKey = fileToBytes(new File(pemPath)); String delimiter = "-----END CERTIFICATE-----"; String[] tokens = new String(certAndKey).split(delimiter); byte[] certBytes = tokens[0].concat(delimiter).getBytes(); byte[] keyBytes = tokens[1].getBytes(); PEMReader reader; reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(certBytes))); X509Certificate cert = (X509Certificate)reader.readObject(); reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(keyBytes))); PrivateKey key = (PrivateKey)reader.readObject(); KeyStore keystore = KeyStore.getInstance("JKS"); keystore.load(null); keystore.setCertificateEntry("cert-alias", cert); keystore.setKeyEntry("key-alias", key, "changeit".toCharArray(), new Certificate[] {cert}); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(keystore, "changeit".toCharArray()); KeyManager[] km = kmf.getKeyManagers(); context.init(km, null, null); return context.getSocketFactory();}
更新 :似乎可以在没有BouncyCastle的情况下完成:
byte[] certAndKey = fileToBytes(new File(pemPath)); byte[] certBytes = parseDERFromPEM(certAndKey, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----"); byte[] keyBytes = parseDERFromPEM(certAndKey, "-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----"); X509Certificate cert = generateCertificateFromDER(certBytes); RSAPrivateKey key = generatePrivateKeyFromDER(keyBytes);
…
protected static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) { String data = new String(pem); String[] tokens = data.split(beginDelimiter); tokens = tokens[1].split(endDelimiter); return DatatypeConverter.parseBase64Binary(tokens[0]); }protected static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException { PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory factory = KeyFactory.getInstance("RSA"); return (RSAPrivateKey)factory.generatePrivate(spec); }protected static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException { CertificateFactory factory = CertificateFactory.getInstance("X.509"); return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes)); }
android – 以编程方式从google play store下载APK
我尝试了市场api并且它工作但现在安装时我会弹出“未知来源”.是否有可能摆脱这种形式?从Play商店应用程序和市场api下载apk有什么区别?
解决方法
this是你可以用它下载应用程序的方法.
android – 如何以编程方式从设备获取System On Chip数据
我希望获得程序化方式的完整处理器名称,如cpu-Z应用程序.例如:Qualcomm Snapdragon 800.最后一个对我来说是最重要的信息,即800.
解决方法:
…like cpu-Z app does. E.g: Qualcomm Snapdragon 800. The last one is the most important information for me, i.e, 800.
@WeybkbcOTHER我可能会让你失望,但你想要获得的信息确实是特定于内核的.在Android设备的广阔市场中,供应商使用了各种各样的设备.如果cpu-Z应用程序显示一个设备所需的信息,并不意味着它对另一个设备的信息相同.同样,这些信息是设备(内核)特定的.
I want to get the complete processor name of an programmatic manner…
Androd操作系统最重要的部分,或者更确切地说是Linux,你可以从/ proc伪文件系统获得这种信息. “文件系统”提供了系统中运行的进程的基于目录的视图以及系统范围的诊断,如处理器信息(同样,您不能依赖于要提供的信息的完整性!).严格地说,/ proc是“设备cpu信息中最接近(较低)的点之一”.
关于“编程方式”,请注意,当从/ proc“filesystem”获取信息时,您将不得不处理解析您要轮询的条目.
下面是一些重要/ proc条目(与命令一起使用)的示例,您可能(或可能不会 – 根据供应商供应)用于派生cpu信息:
> cat / proc / cpuinfo当然,您可以在哪里找到cpu系列名称(如果有的话)(在硬件密钥下);
> cat / proc / stat,您可以在其中调查cpu核心数(表示为cpux,其中x根据核心数计算);
推荐阅读:Android Internals::Power User’s View by Jonathan Levin.
Android 获取keystore SHA1方法
第一步、打开Android Studio的Terminal工具
第二步、输入命令:keytool -v -list -keystore keystore文件路径
第三步、输入Keystore密码

(第二种方式)使用 keytool(jdk自带工具)获取SHA1
,按照如下步骤进行操作:
1.运行进入控制台。

2.在弹出的控制台窗口中输入 cd .android 定位到 .android 文件夹。

3.继续在控制台输入命令。
debug.keystore:命令为:keytool -list -v -keystore debug.keystore
自定义的 keystore:命令为:keytool -list -v -keystore apk的keystore
如下所示:

提示输入密钥库密码,编译器提供的debug keystore默认密码是 android,自定义签名文件的密码请自行填写。输入密钥后回车(如果没设置密码,可直接回车),此时可在控制台显示的信息中获取 SHA1 值,如下图所示:

说明:keystore 文件为 Android 签名证书文件。
Babylonjs -- 如何以编程方式获取 Inspector 信息?
如何解决Babylonjs -- 如何以编程方式获取 Inspector 信息??
当我在 Babylon 中查看场景时,Inspector 可以选择查看 Statistics Pane > Count
。此信息包含诸如 Total meshes,Active meshes,Active indices,...,Total materials,Total textures.
我想使用 Babylonjs 库获取此信息,但无法使用文档弄清楚。您能否告知 Babylonjs API 的哪一部分支持以编程方式获取上述数据的功能?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
今天关于以编程方式从PEM获取KeyStore和编写程序,使用pickle模块将包含学生成绩的分享就到这里,希望大家有所收获,若想了解更多关于android – 以编程方式从google play store下载APK、android – 如何以编程方式从设备获取System On Chip数据、Android 获取keystore SHA1方法、Babylonjs -- 如何以编程方式获取 Inspector 信息?等相关知识,可以在本站进行查询。
本文标签: