标签: java-security

通过安全消息从智能卡读取信息

我有行车记录仪公司卡,用于在允许他通过远程下载下载行车记录仪的数据之前对客户端进行身份验证.我的代码中使用的APDU命令是在行车记录仪和公司卡之间成功验证的命令.

双方之间的联系如下:

行车记录仪< - 可以连线 - >设备<---蓝牙 - > Android应用程序< - 套接字API - >公司卡服务器< - USB电缆 - >公司读卡器< - >公司卡.

如上所述的通信运行良好,并且app用户正在进行身份验证.现在我试图直接从公司卡上读取一些信息而不使用以下应用程序:

我的客户端程序< - >读卡器< - >公司卡

在我的客户端程序中,我使用从Android应用程序发送到公司卡的相同APDU命令.目前,我正面临INS标签"82"的外部认证问题.我收到的错误66 88意味着wrong certification.

我已经下载了认证文件,D__TCC40-1.bin

https://dtc.jrc.ec.europa.eu/dtc_public_key_certificates.php

公钥认证内容描述如下:

128字节签名+ 58字节公钥提醒+ 8字节证书Authorithy Reference = 194字节

在读取文件时,D__TCC40-1.bin它具有194字节长度(公司卡也使用长度为194的认证).外部认证从'84'INS命令开始低音开始.该命令由终端发送到智能卡,以提供8位数的随机数.随后,终端接收随机数并使用一些使用公钥进行加密的加密算法对其进行加密.然后,终端通过算法将带有82INS标签的加密号码发送到智能卡.

现在我正在尝试D__TCC40-1.bin从项目根目录加载下载的证书并使用它来加密我使用GET CHALLANGE 84INS标记获得的8位数随机数,但我不知道如何使用alogrithm 加密它以发送其结果到智能卡.我如何使用Public Key Certificateencyrpte随机数将其发送到智能卡以获得90 00响应?目前,正如我之前提到的,我正在66 88作为回应.

在此输入图像描述

在此输入图像描述

***码*

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import javax.smartcardio.ATR;
import …
Run Code Online (Sandbox Code Playgroud)

java encryption rsa apdu java-security

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

使用带有非 ASCII 密码的 PCKS#12 证书

我尝试打开 PKCS#12 文件,但由于密码不是 ASCII(包含波兰语字符),因此在执行 KeyStore.load() 时出现“密码不是 ASCII”异常。使用这个证书有什么解决办法吗?

java pkcs#12 java-security

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

带有安全管理器的 Tomcat 9.0 报告 Windows 上的访问被拒绝

我在 Windows 10 上启动了我的 Tomcat 9.0:

-Djava.security.manager
-Djava.security.policy==C:\Program Files\Apache Software Foundation\Tomcat 9.0\conf\catalina.policy
-Djava.security.debug=access,failure
Run Code Online (Sandbox Code Playgroud)

使用 org.apache.coyote.http11.Http11Nio2Protocol 类型的连接器并启用 ssl。

此外,我只有(我自己的)ROOT 应用程序在运行,没有别的。

在 catalina.policy 中,我定义了(第一次测试):

grant codeBase "file:${catalina.base}/webapps/ROOT/-" {
  permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)

当我现在检查 tomcat9-stderr.log 时,我发现了以下条目:

access: access denied ("java.util.PropertyPermission" "org.apache.juli.logging.UserDataHelper.CONFIG" "read")

java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Unknown Source)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at org.apache.tomcat.util.log.UserDataHelper.<init>(UserDataHelper.java:57)
at org.apache.coyote.AbstractProcessor.<init>(AbstractProcessor.java:90)
at org.apache.coyote.http2.StreamProcessor.<init>(StreamProcessor.java:56)
at org.apache.coyote.http2.Http2UpgradeHandler.processStreamOnContainerThread(Http2UpgradeHandler.java:261)
at org.apache.coyote.http2.Http2UpgradeHandler.headersEnd(Http2UpgradeHandler.java:1356)
at org.apache.coyote.http2.Http2AsyncUpgradeHandler.headersEnd(Http2AsyncUpgradeHandler.java:37)
at org.apache.coyote.http2.Http2Parser.onHeadersComplete(Http2Parser.java:583)
at org.apache.coyote.http2.Http2Parser.readHeadersFrame(Http2Parser.java:272)
at org.apache.coyote.http2.Http2AsyncParser$FrameCompletionHandler.completed(Http2AsyncParser.java:167)
at org.apache.coyote.http2.Http2AsyncParser$FrameCompletionHandler.completed(Http2AsyncParser.java:85)
at …
Run Code Online (Sandbox Code Playgroud)

java tomcat securitymanager java-security tomcat9

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

Java 11 SSL 异常:无法找到请求目标的有效证书路径

在尝试将我的一个应用程序从 java 8 升级到 java 11 期间,我遇到了一个奇怪的 SSL 异常:“无法找到有效的认证”

此应用程序的配置会使用包中的默认 jdk / jrecacerts覆盖,因此在升级之前和之后,密钥存储中的证书应该相同(这也可以使用 进行验证):cacertsca-certificates-javakeytools

# java 8
ls -l /usr/lib/jvm/java-1.8.0/jre/lib/security/cacerts
lrwxrwxrwx 1 root root 41 Sep 11 22:52 /usr/lib/jvm/java-1.8.0/jre/lib/security/cacerts -> /etc/pki/java/cacerts

# java 11
ls -l /usr/lib/jvm/jdk-11.0.2/lib/security/cacerts
lrwxrwxrwx 1 root root 21 Oct 29 21:22 /usr/lib/jvm/jdk-11.0.2/lib/security/cacerts -> /etc/pki/java/cacerts
Run Code Online (Sandbox Code Playgroud)

调查了几天,但我没有得到任何结果。我认为这可能是由于版本之间的SunJSSE安全性变化引起的,但我无法确认。Provider1.811.0

我对java安全性不熟悉,想寻求帮助。该示例已简化为该项目,并且重现此问题的说明位于 README.md

异常调用栈:

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested …
Run Code Online (Sandbox Code Playgroud)

java ssl ssl-certificate java-security java-11

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

如何在基于 PKCS11 的 SafeNet HSM 中使用 Brainpool 曲线生成 ECDSA 密钥?

我正在尝试使用 Safenet HSM 上的脑池曲线生成 ECDSA 密钥。我在 Safenet HSM 上启用了用户定义的域参数,但我们遇到了异常

 java.security.InvalidAlgorithmParameterException: params must be either a subtype of java.security.spec.ECParameterSpec or of type ECGenParameterSpec!
    at iaik.security.ec.common.ECKeyPairGenerator.initialize(Unknown Source) ~[iaik_eccelerate.jar:5.0]
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码

ECDSAPrivateKey obj_privateKeyTemplate = new ECDSAPrivateKey();
    ECDSAPublicKey obj_publicKeyTemplate = new ECDSAPublicKey();

    obj_privateKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
    obj_privateKeyTemplate.getToken().setBooleanValue(Boolean.FALSE); // temporary session key ?

    obj_publicKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);
    obj_publicKeyTemplate.getToken().setBooleanValue(Boolean.FALSE); // temporary session key  ?
    ObjectID eccCurveObjectID = new ObjectID("1.3.36.3.3.2.8.1.1.1");
    obj_publicKeyTemplate.getEcdsaParams().setByteArrayValue(DerCoder.encode(eccCurveObjectID));
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "IAIK ECCelerate");
    AlgorithmParameterSpec keyPairGenerationSpec = (AlgorithmParameterSpec) new PKCS11KeyPairGenerationSpec(
            null, obj_publicKeyTemplate, obj_privateKeyTemplate).setUseUserRole(true)
            .setTokenManager(this.m_objTokenManager);
    keyPairGenerator.initialize(keyPairGenerationSpec, new SecureRandom());
    obj_keypair = keyPairGenerator.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题。

java hsm ecdsa iaik-jce java-security

5
推荐指数
0
解决办法
430
查看次数

如何在通过 gradle 执行 JUnit 测试时设置 java 安全策略文件以仅避免 System.exit 调用?

我想通过 gradle 执行 JUnit 测试,我想避免在这些测试中调用 System.exit() 调用。我读过设置安全策略文件可以解决问题。

这是我正在使用的安全策略文件

grant {
    permission java.io.RuntimePermission "exitVM", "none";
};
Run Code Online (Sandbox Code Playgroud)

我在 gradle 构建文件中设置 seecurity.policy 和安全管理器属性,如下所示:

systemProperty 'java.security.policy', file(project.ext.projectHome + "/security.policy").absolutePath
jvmArgs "-Djava.security.manager"
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,测试任务失败并显示以下堆栈跟踪:

uccessfully started process 'Gradle Test Executor 20'
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
Caused by: java.lang.ExceptionInInitializerError
        at mockit.internal.state.TestRun.<init>(TestRun.java:43)
        at mockit.internal.state.TestRun.<clinit>(TestRun.java:22)
        at mockit.internal.faking.FakeMethods.registerFakeStates(FakeMethods.java:210)
        at mockit.internal.faking.FakeClassSetup.registerFakeClassAndItsStates(FakeClassSetup.java:57)
        at mockit.internal.faking.FakeClassSetup.<init>(FakeClassSetup.java:48)
        at mockit.internal.faking.FakeClassSetup.<init>(FakeClassSetup.java:35)
        at mockit.MockUp.redefineClass(MockUp.java:122)
        at mockit.MockUp.<init>(MockUp.java:80)
        at mockit.integration.junit4.FakeRunNotifier.<init>(FakeRunNotifier.java:24)
        at mockit.internal.startup.JMockitInitialization.applyInternalStartupFakesAsNeeded(JMockitInitialization.java:37)
        at mockit.internal.startup.JMockitInitialization.initialize(JMockitInitialization.java:26)
        at mockit.internal.startup.Startup.applyStartupFakes(Startup.java:58) …
Run Code Online (Sandbox Code Playgroud)

java junit gradle java-security java-security-manager

5
推荐指数
0
解决办法
85
查看次数

java.security.properties - 未应用更改

我尝试将安全属性附加到 java.security。因此,我添加了一个属性“java.security.properties”,指定要附加的文件。

我检查了 security.overridePropertiesFile 是否设置为 true。

由于某种原因,未应用对安全策略的更改。如果我直接更改文件“java.security”,一切都会正常。

找不到文件或文件内容不正确。我没有收到任何有关该位置的错误消息。我尝试了绝对路径、相对路径。该文件的内容如下(一行):

jdk.tls.disabledAlgorithms=ECDH, DH, RC4, DES, MD5withRSA, 3DES_EDE_CBC, DESede, DES, anon, NULL

我猜路径有问题,但不知道,因为没有关于它的日志。但无法找到有关路径的良好信息。所有示例都是相对路径,对我来说也不起作用。

我使用的是JDK11。

java java-security java-security-manager java-11

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

是否可以强制 JVM 检查每个 jar 都必须签名?

是否可以强制 JVM 检查类加载器上加载的每个 JAR 是否都已签名?

我期望的行为是:如果签名错误或jar文件未签名,则JVM崩溃,否则程序运行顺利。

java security jvm jar java-security

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

“PKIX 路径构建失败:无法找到请求目标的有效证书路径” 仅在发布版本中

这个问题有点棘手。我尝试通过 LDAPS 将我的 war 文件连接到 Active Directory。在 IntelliJ IDEA 中使用调试模式运行时,代码运行得非常好。

当我在同一台或不同机器上安装 war 文件时,遇到此错误。

sun.security.validator.ValidatorException: PKIX path building failed:    sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Run Code Online (Sandbox Code Playgroud)

证书是自签名的。我已在 中添加了 CA.crt truststore.jks,在 中添加了 LDAP.cer cacerts。我也尝试添加“jssecacerts”,但结果相同。

注意:我使用 Apache Shiro 框架。

如何避免这个错误呢?为什么它没有进入调试模式?

java intellij-idea ssl-certificate shiro java-security

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

是否可以通过使用 JNI 来避免 jvm 安全?

我一直在思考 jvm 安全的工作方式。其原理是 jvm 始终信任并运行任何本机代码。因此,从概念上讲,如果您的代码不checkpermission(permission)显式或隐式调用,则意味着它永远不会失败任何安全验证。当然,所有这些验证调用通常都是在 Java API 类中完成的,因此我们不需要自己调用它们来获取内置权限。

现在,只要您使用诸如 之类的内置类FileOutputStream,您的代码就始终需要接受权限检查。但是想了想之后,我想知道是否可以通过使用Java Native Interface来运行c++代码来避免安全检查。

想象一下,您导入了一些 jar,而不是FileOutputStream用来写入文件,而是使用一些手工制作的 JNI,这些 JNI 绑定到文件编写 C++ 程序(显然它不调用任何checkpermission())。基于问题“如何在 JAR 中捆绑本机库和 JNI 库? ”,我了解到可以将所有内容捆绑在一个漂亮的恶意 jar 中。因此,使用此 jar 的任何代码都不再安全,因为从 jar 执行代码时不会进行安全验证。这意味着这个 c++ 程序可以有效地覆盖运行 jvm 的进程对其具有写权限的所有文件。

这是正确的思维方式,它是有意为之还是我错过了什么?

java java-native-interface jvm jar java-security

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