小编Ben*_*ron的帖子

如何创建包含客户端证书链的BKS(BouncyCastle)格式Java密钥库

我正在编写一个需要SSL客户端身份验证的Android应用.我知道如何为桌面Java应用程序创建JKS密钥库,但Android仅支持BKS格式.我试图创建密钥库的每一种方式都会导致以下错误:
handling exception: javax.net.ssl.SSLHandshakeException: null cert chain

所以看起来客户端永远不会发送正确的证书链,可能是因为我没有正确创建密钥库.我无法在桌面上启用SSL调试,因此这使得它比应该更加困难.

作为参考,以下是IS用于创建BKS 信任库的命令:
keytool -importcert -v -trustcacerts -file "cacert.pem" -alias ca -keystore "mySrvTruststore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar" -storetype BKS -storepass testtest


这是我尝试过的命令,它无法创建BKS客户端密钥库:

cat clientkey.pem clientcert.pem cacert.pem > client.pem

keytool -import -v -file <(openssl x509 -in client.pem) -alias client -keystore "clientkeystore" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar" -storetype BKS -storepass testtest
Run Code Online (Sandbox Code Playgroud)

java ssl android

51
推荐指数
4
解决办法
10万
查看次数

在Android上使用客户端/服务器证书进行双向身份验证SSL套接字

我正在开发一款需要客户端和服务器证书身份验证的Android应用.我有一个SSLClient类,我创建它在常规桌面Java SE 6上运行得很漂亮.我已将它移动到我的Android项目中,我收到以下错误:"未找到KeyStore JKS实现".

我在网上看了一下,看起来有可能在Android上不支持Java Keystores(太棒了!)但是我觉得它还有更多的东西,因为我发现的示例代码都不像我我试图去做.我发现的一切都谈到了使用http客户端而不是原始SSL套接字.我需要这个应用程序的SSL套接字.

下面是我的SSLClient.java文件中的代码.它读取密钥库和信任库,创建到服务器的SSL套接字连接,然后在等待来自服务器的输入行时运行循环,然后通过调用不同类中的方法来处理它们.我非常有兴趣听到有任何在Android平台上使用SSL套接字的经验的人.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.security.AccessControlException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import otherpackege.OtherClass;

import android.content.Context;
import android.util.Log;

public class SSLClient 
{
    static SSLContext ssl_ctx;

    public SSLClient(Context context)
    {
        try
        {
            // Setup truststore
            KeyStore trustStore = KeyStore.getInstance("BKS");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            InputStream trustStoreStream = context.getResources().openRawResource(R.raw.mysrvtruststore);
            trustStore.load(trustStoreStream, "testtest".toCharArray());
            trustManagerFactory.init(trustStore); …
Run Code Online (Sandbox Code Playgroud)

java ssl android

43
推荐指数
1
解决办法
5万
查看次数

如何将NSString转换为十六进制值

我想将常规NSString转换为带有(我假设的)ASCII十六进制值的NSString并返回.

我需要生成与下面的Java方法相同的输出,但我似乎无法在Objective-C中找到一种方法.我在C和C++中找到了一些例子,但是我很难将它们用到我的代码中.

以下是我正在尝试重现的Java方法:

/**
* Encodes the given string by using the hexadecimal representation of its UTF-8 bytes.
*
* @param s The string to encode.
* @return The encoded string.
*/
public static String utf8HexEncode(String s) {
    if (s == null) {
        return null;
    }
    byte[] utf8;
    try {
        utf8 = s.getBytes(ENCODING_UTF8);
    } catch (UnsupportedEncodingException x) {
        throw new RuntimeException(x);
    }
    return String.valueOf(Hex.encodeHex(utf8));
}

/**
* Decodes the given string by using the hexadecimal representation of its UTF-8 bytes. …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c

29
推荐指数
4
解决办法
5万
查看次数

在Objective-C中,为什么id被用作init方法的返回类型?

我做了一些快速搜索,无法找到答案.

我很想知道为什么在Objective-C中,它id被用作init方法的返回类型.

我的猜测是因为如果类被重写,你不想返回超类的类型的对象,但我有兴趣知道它是否由于其他原因而完成.

objective-c

29
推荐指数
2
解决办法
6148
查看次数

如何递归地检查包括所有子模块的旧git提交?

我有一个包含多个子模块的git repo.其中一个子模块有自己的多个子模块.我要做的就是检查主仓库上的旧提交,并检查所有子模块的相应提交,以获得当时代码的正确状态.

我知道git包含必要的信息,因为ls-tree命令可以告诉我每个子模块所在的提交.但是,我必须手动检查每一个,这是非常耗时的.

我正在寻找类似的东西,git checkout --recursive但这样的命令似乎并不存在.

反正有没有这样做?

git git-submodules

24
推荐指数
3
解决办法
1万
查看次数

如何在Android平台上启用SSL调试?

是否有类似于-D javax.net.debug=ssl在Java桌面应用程序的命令行设置,但对于Android?我已尝试在代码中设置它,System.setProperty("javax.net.debug", "ssl");但这不起作用.

如果没有办法启用此属性,是否至少有另一种方法来调试SSL连接的客户端?

编辑:只是为了澄清,这是指原始SSL套接字(SSLSocket和SSLSocketFactory),而不是Apache库或任何其他网络库.

java ssl android

17
推荐指数
1
解决办法
5052
查看次数

使用VisualVM通过防火墙连接到远程jstatd实例

可能重复:
VisualVM over ssh

我正在写这个问题并回答它,因为我今天花了几个小时才开始工作,我在这里找不到任何答案.希望这对其他人有帮助.如果你有另一个解决方案,而不是我最终使用的解决方案,请随时回答这个问题.如果你的更好,我会接受你的.

问题:我正在尝试使用VisualVM和jstatd监视我的FreeBSD服务器上的一些自制java应用程序(这也应该适用于Linux服务器),但我无法让VisualVM列出服务器上的进程,即使我转发我的防火墙中分配的和随机的jstatd端口,可以看到使用sockstat建立的连接.

java linux freebsd

17
推荐指数
1
解决办法
4万
查看次数

为什么Apple之前是typedef引用(指针)类型但现在不是?

我一直想知道为什么Apple在Core Foundation中使用了类型为指针类型的数据类型,而在Cocoa中却没有.

作为一个例子,你会引用一个UIColor对象,就像UIColor *对CGColor对象的引用一样CGColorRef?还是NSURL *CFURLRef?为什么不总是使用CGColor *CFURL *?或者相反,为什么没有UIColorRefNSURLRef类型,因为你从来没有访问UIColorNSURL直接访问?

或者例如,它为什么id而不是id *,因为它实际上是一个指针,实际上可以强制转换为void *

具体来说,是否有一些原因让Apple习惯在旧框架中执行此操作,但是在Cocoa中停止了这样做?这只是风格问题吗?

cocoa macos-carbon objective-c core-foundation

7
推荐指数
1
解决办法
297
查看次数

应用程序后台运行时出现奇怪的 CPU 使用问题

我的音频流应用程序遇到了一个非常奇怪的 CPU 使用错误。

当应用在前台播放音乐时,设备 CPU 总使用率只有 15% 左右。但是,一旦应用程序进入后台,CPU 使用率就会飙升至 100% 并保持在那里。

其中大约 40% 来自应用程序进程本身,大约另外 60% 来自 SpringBoard 进程,它显然处理所有 Core Animation 调用(虽然我没有明确使用 Core Animation,但我假设它也处理其他 UI 相关活动)。此外,根据“CPU 活动”工具,应用进程本身的大部分额外 CPU 使用都属于“图形”类别,尽管我确实看到“音频处理”和(奇怪的是)“前台”应用活动”类别。

我怎样才能弄清楚是什么导致了这个问题?仪器告诉我高电平什么正在发生的事情,而不是为什么它的发生。

iphone ios

5
推荐指数
1
解决办法
1616
查看次数

在SignalR中启用服务器端日志记录

我正在尝试调试SignalR连接问题,虽然我知道如何启用客户端日志记录,但我不知道如何启用服务器端日志记录.它似乎没有记录任何东西到控制台.

我在HubConfiguration中尝试使用EnableDetailedErrors = true,但似乎没有做任何事情.

signalr signalr-hub

5
推荐指数
1
解决办法
3057
查看次数

查找二进制文件中的类符号来源

我有一个有趣的问题。我收到崩溃日志,该崩溃日志引用了我的应用程序中的一个名为NRURLProtocol的类(具体是在文件NRURLProtocol.m中),根据崩溃日志,该类存在于我的应用程序中,而不存在于iOS框架中。但是,我的项目中没有NRURLProtocol类,也没有任何NRURLProtocol.m文件。通过Google或StackOverflow在线进行的搜索从字面上发现了对该类的0个引用。

如果我在二进制文件上运行以下命令:

otool -o binary | grep NR
Run Code Online (Sandbox Code Playgroud)

我发现带有NR前缀的各种类,包括NRURLProtocol。但是,当我otool在所有与二进制文件链接的静态库上使用相同的命令时,什么也没找到。我在驱动器上找不到名为NRURLProtocol.m的文件。

我对如何追踪这个问题有些茫然。此类不仅存在于我的二进制文件中,而且还被某些东西作为URL协议加载。因此,即使没有otool找到任何东西,我正在使用的某些第三方库似乎也包含它。

这是出现在我的二进制文件中的带有NR前缀的类的完整列表:

NRASIRequestTracker
NRASISupport
NRErrorData
NRLogger
NRNonARCMethods
NRSecureUDID
NRStats
NRStatsEngine
NRSupportability
NRTransactionData
NRURLProtocol
NRNSURLSupport
Run Code Online (Sandbox Code Playgroud)

这是我链接到的所有第三方静态库:

Facebook SDK
HockeyApp SDK
ZipKit
Mixberry SDK (though not actually using it anywhere, currently disabled)
Flurry SDK
Google AdMob SDK
HelpShift SDK
UrbanAirship SDK
libBass (audio library, doesn't contain Objective-C code)
EX2Kit (my own toolkit library, which doesn't contain this code)
Run Code Online (Sandbox Code Playgroud)

有没有人知道这些类的来源或我可以尝试的其他命令?

iphone objective-c ios

5
推荐指数
1
解决办法
1367
查看次数

这个递归同步调用如何不是死锁?

我有一组所有同步到类对象的方法(不能使用self,因为这个对象的多个实例可以在多个线程中使用).其中一些方法调用类中的其他方法,这些方法也在类对象上同步.不知何故,这可以工作,并不会导致我期望的死锁.

我认为testA将被阻止运行,因为testB已经锁定了类对象,但显然情况并非如此.

是@synchronized正在做的特殊事情还是这是底层互斥锁的一个特性?


有效的示例代码:

- (NSUInteger)testA
{
    @synchronized(self.class)
    {
        NSLog(@"Doing something in A");
    }
    return 1;
}

- (void)testB
{
    @synchronized(self.class)
    {
        NSLog(@"Doing something in B");
        NSLog(@"A returned: %i", [self testA]);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用testB时输出为:

Doing something in B
Doing something in A
A returned: 1
Run Code Online (Sandbox Code Playgroud)

mutex deadlock locking objective-c

3
推荐指数
1
解决办法
2458
查看次数