JSSE允许用户通过指定javax.net.ssl.*参数来提供默认信任存储和密钥存储.我想为我的应用程序提供一个非默认的TrustManager,同时允许用户像往常一样指定KeyManager,但似乎没有任何方法可以实现这一点.
假设在unix机器上我想允许用户使用pkcs12密钥库进行身份验证,而在OS XI上则希望允许用户使用系统密钥链.在OS X上,应用程序可能会按如下方式启动:
java -Djavax.net.ssl.keyStore=NONE -Djavax.net.ssl.keyStoreType=KeychainStore \
-Djavax.net.ssl.keyStorePassword=- -jar MyApplication.jar
Run Code Online (Sandbox Code Playgroud)
这将很好地工作:当应用程序访问需要相互身份验证(客户端证书身份验证),那么用户将被提示允许访问自己的钥匙串HTTPS服务器.
现在假设我想将自签名证书颁发机构与我的应用程序捆绑在一起.我可以通过构造一个TrustManagerFactory并传入一个包含我的证书(javadoc)的KeyStore来覆盖默认的信任管理器.但是,要使用此非默认信任管理器,我需要创建并初始化SSLContext.这里存在问题.
通过调用init(..)并传递KeyManager和TrustManager 来初始化SSLContexts .但是,使用javax.net.ssl.*参数创建KeyManager的逻辑嵌入在默认SSLContexts的实现中 - 我找不到使用默认行为获取KeyManager或KeyManagerFactory的方法,同时还指定了非默认的TrustManager或TrustManagerFactory.因此,似乎是不可能的使用,例如,适当的操作系统特定钥匙扣实施,同时还提供用于认证远程服务器根证书.
我有一个Java类,具有使用C ++实现的本机函数,称为nz.ac.unitec.BigInteger。的本机实现nz.ac.unitec.BigInteger很简单,只是包裹java.math.BigInteger,并调用它的构造函数和add,subtract,multiply...功能。一个字段mNativeContext中nz.ac.unitec.BigInteger用于存储的全局引用一个java.math.BigInteger对象。该对象具有终结器,该终结器应该在垃圾回收对象时销毁全局引用,因此我不会泄漏全局引用。
当我运行一个简单的测试循环以创建多个nz.ac.unitec.BigInteger对象而不显式释放所创建的对象时,在日志(LOG1)之后报告了JNI错误。但是,如果我在离开测试功能之前显式释放创建的对象,则压力测试可以成功执行。
当我有终结器要在垃圾回收对象中删除它们时,为什么JVM的全局引用用完了?
LOG1:
F/art (10730): art/runtime/indirect_reference_table.cc:113] JNI ERROR (app bug): global reference table overflow (max=51200)
F/art (10730): art/runtime/indirect_reference_table.cc:113] global reference table dump:
F/art (10730): art/runtime/indirect_reference_table.cc:113] Last 10 entries (of 51200):
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51199: 0x12e88790 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51198: 0x12e85490 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51197: 0x12e81790 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51196: 0x12e7e760 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51195: …Run Code Online (Sandbox Code Playgroud)