通过JNI调用C ++的Java 1.8本机System.load会产生TLSv1。如何获得TLSv1.2?

时间:2018-06-19 22:40:56

标签: java c++ java-native-interface tls1.2

我有一些简单的Java代码:

public class Test1 { 

    static { System.load("D://HelloWorld.dll"); }

    public native String displayHelloWorld(String aaa);

    public static void main (String[] args) {
        Test1 t = new Test1();
        String aaa = "Hello World";
        String output = t.displayHelloWorld(aaa);
        System.out.println(output);
    }
}

我有一些制作HelloWorld.dll的简单C ++代码。 Source Code Link

一些错误的开始之后,C ++代码运行正常。但是,我使用的C ++代码链接到.dll(我不控制),并且该.dll进行了安全的Web服务调用。问题是,如何控制该安全Web服务调用的TLS版本。

如果我使用相同的C ++代码,并使用4.6版的.NET目标版本进行编译,则在控制台应用程序中,它将使用TLSv1.2发出Web服务请求(根据wireshark)。但是,如果我将相同的代码移到动态DLL(上面的HelloWorld.dll)中,然后从上面的Java调用该.dll,则Web服务请求将使用TLSv1。

为什么?我认为Java JNI中一定有某些东西将TLS限制为TLSv1,但是那又是什么呢?如何让我的JNI使用TLSv1.2。

我尝试利用以下内容: Java 1.8默认TLS应该为v1.2(我正在使用Java版本“ 1.8.0_171”) Java命令行标志:-Dhttps.protocols =“ TLSv1.2” -Djdk.tls.client.protocols =“ TLSv1.2”(这些似乎没有影响)

谢谢您的建议。

Similar Question

1 个答案:

答案 0 :(得分:0)

更新: 我不确定是否所有步骤都是必需的,但这是使我最终获得与Web服务的TLSv1.2连接的步骤。

1)我试图连接的服务的所有者将Web服务设置修改为仅允许TLS1.2。

2)对连接到Web服务的库进行了少量修改。在尝试进行任何网络通信之前,添加了以下代码行:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

提醒我的情况: Java-> C ++->库-> WebService

所以有2处更改,一个在Library中进行更改,以专门请求Tls12,另一个在WebService处进行更改以阻止所有其他通信样式。

我认为区别在于添加到库中的代码行。我本来希望在不对库进行任何修改的情况下解决该问题,但是由于该问题现在已经解决,因此我完成了,并且感谢大家在我的问题上花费的所有时间。