Big Sur 11.0.1和PC/SC库的问题

5

我在使用最新版本的macOS(BigSur 11.0.1)和PC/SC库时遇到了问题;在更新之前,使用该库的程序可以正常工作,但更新后就无法工作了。我正在使用Java版本1.8.0_271。

在代码中,我使用方法TerminalFactory.getDefaultType()来获取终端工厂的默认类型。更新前,我收到的是“PC/SC”,但更新后我收到的是None。

如果我想强制连接到一个实例,可以使用以下命令行:

TerminalFactory factory = TerminalFactory.getInstance("PC/SC", null);

它将返回以下错误:

java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: PC/SC, provider: SunPCSC, class: sun.security.smartcardio.SunPCSC$Factory)
at java.security.Provider$Service.newInstance(Provider.java:1711)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:243)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:190)
at javax.smartcardio.TerminalFactory.getInstance(TerminalFactory.java:245)
at prueba.Prueba.isConnected(Prueba.java:165)
at prueba.Prueba.main(Prueba.java:63)
Caused by: java.lang.UnsupportedOperationException: PC/SC not available on this platform
at sun.security.smartcardio.PCSC.checkAvailable(PCSC.java:46)
at sun.security.smartcardio.SunPCSC$Factory.<init>(SunPCSC.java:59)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.security.Provider$Service.newInstance(Provider.java:1703)
... 5 more
Caused by: java.io.IOException: No PC/SC library found on this system
at sun.security.smartcardio.PlatformPCSC.getLibraryName(PlatformPCSC.java:122)
at sun.security.smartcardio.PlatformPCSC.access$000(PlatformPCSC.java:43)
at sun.security.smartcardio.PlatformPCSC$1.run(PlatformPCSC.java:64)
at sun.security.smartcardio.PlatformPCSC$1.run(PlatformPCSC.java:60)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.smartcardio.PlatformPCSC.<clinit>(PlatformPCSC.java:60)
at sun.security.smartcardio.SunPCSC$Factory.<init>(SunPCSC.java:59)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.security.Provider$Service.newInstance(Provider.java:1703)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:243)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:190)
at javax.smartcardio.TerminalFactory.getInstance(TerminalFactory.java:245)
at javax.smartcardio.TerminalFactory.<clinit>(TerminalFactory.java:106)
at prueba.Prueba.isConnected(Prueba.java:164)
... 1 more
entro isConnected--2
Exception in thread "main" java.lang.NullPointerException
at prueba.Prueba.isConnected(Prueba.java:173)
at prueba.Prueba.main(Prueba.java:63)

我发现Big Sur删除了PC / SC库,因此无法安装它。

我不知道是否有人遇到同样的错误或已经解决了这个问题。

感谢您的帮助。


我找到的最好的是:https://developer.apple.com/forums/thread/657267 - Jorge Campos
1
@JorgeCampos 是的,我已经看过这篇帖子了,但是我没有使用在论坛中解释的文件系统dlopen(3)。 - Ariel Ballestero
1个回答

8
由于macOS Big Sur的更改,Java PC/SC实现不再正确工作: https://bugs.openjdk.java.net/browse/JDK-8255877 解决方法是在尝试使用TerminalFactory之前设置系统属性: sun.security.smartcardio.library=/System/Library/Frameworks/PCSC.framework/Versions/Current/PCSC

非常感谢!你的回答节省了我很多时间。 - Mirjalol Bahodirov
1
实际上,PCSC执行文件存在于我的Sierra专业版电脑上,但在Big Sur的Air电脑上不存在。 - GCamel
请注意,bash中的java -Dproperty=value是有效的! - GCamel
System.setProperty("sun.security.smartcardio.library", "/System/Library/Frameworks/PCSC.framework/Versions/Current/PCSC"); 这对我有效! - Pemassi
在BigSur和JDK 14上添加“-Dsun.security.smartcardio.library=/System/Library/Frameworks/PCSC.framework/PCSC”可以生效。 - csharpfolk
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接