通过外部Java应用程序访问密钥库不会返回每个密钥库

2020-09-10 10:48发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家晚上好

我遇到有关SAP密钥库和JNDI的问题。

首先,我们有一个与sap("独立")无关的Java应用程序,该应用程序试图访问SAP密钥库。

我们通过使用JNDI来实现

 jndiContext =新的InitialContext(属性); 

其属性如下:

 java.naming.provider.url = <主机名>:,java.naming.factory.initial = com.sap.engine.services.jndi.InitialContextFactoryImpl,java.naming.security.principal = <用户名>  ,java.naming.factory.url.pkgs = com.sap.engine.services,java.naming.security.credentials = <密码>,HTTPPORT = 50000
 

并获取KeystoreManager:

 ksManager =(KeystoreManager)jndiContext.lookup(" keystore"); 

然后,我们尝试列出以下所有密钥库:

字符串keystoreAliases [] = ksManager.getKeystoreViewAliases(); 

这将返回一些密钥库,但不是系统上的每个密钥库。

如果我随后尝试明确访问未列出的密钥库之一,则会出现以下错误。

无法检索
 别名的密钥库:java.rmi.RemoteException:com.sap.engine.services.keystore.exceptions.BaseRemoteException:
 远程通话失败
 。
 。
 。

 造成原因:
 java.security.KeyStoreException:用户来宾没有权限
 com.sap.engine.services.keystore.impl.security.KeystoreViewPermission与
 参数名称keystore-view.view.CTCView
 动作IS_VIEW_EXISTS
 实例全部
 

然后我尝试寻找一种解决方案,该解决方案是如何在我在initialContext属性中指定的用户访问密钥库的,但是找不到任何东西。

我偶然发现的是以下代码片段:

 managerPriviliged = com.sap.aii.af.service.resource.SAPSecurityResources.getInstance()。getKeyStoreManager(com.sap.aii.security.lib.PermissionMode.SYSTEM_LEVEL); 

应该可以为我提供具有正确用户权限的keystoremanager。

问题是我找不到使用JNDI进行这项工作的方法!

是否可以执行此操作?或者您是否有人对如何以访客用户身份访问其他密钥库有想法?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家晚上好

我遇到有关SAP密钥库和JNDI的问题。

首先,我们有一个与sap("独立")无关的Java应用程序,该应用程序试图访问SAP密钥库。

我们通过使用JNDI来实现

 jndiContext =新的InitialContext(属性); 

其属性如下:

 java.naming.provider.url = <主机名>:,java.naming.factory.initial = com.sap.engine.services.jndi.InitialContextFactoryImpl,java.naming.security.principal = <用户名>  ,java.naming.factory.url.pkgs = com.sap.engine.services,java.naming.security.credentials = <密码>,HTTPPORT = 50000
 

并获取KeystoreManager:

 ksManager =(KeystoreManager)jndiContext.lookup(" keystore"); 

然后,我们尝试列出以下所有密钥库:

字符串keystoreAliases [] = ksManager.getKeystoreViewAliases(); 

这将返回一些密钥库,但不是系统上的每个密钥库。

如果我随后尝试明确访问未列出的密钥库之一,则会出现以下错误。

无法检索
 别名的密钥库:java.rmi.RemoteException:com.sap.engine.services.keystore.exceptions.BaseRemoteException:
 远程通话失败
 。
 。
 。

 造成原因:
 java.security.KeyStoreException:用户来宾没有权限
 com.sap.engine.services.keystore.impl.security.KeystoreViewPermission与
 参数名称keystore-view.view.CTCView
 动作IS_VIEW_EXISTS
 实例全部
 

然后我尝试寻找一种解决方案,该解决方案是如何在我在initialContext属性中指定的用户访问密钥库的,但是找不到任何东西。

我偶然发现的是以下代码片段:

 managerPriviliged = com.sap.aii.af.service.resource.SAPSecurityResources.getInstance()。getKeyStoreManager(com.sap.aii.security.lib.PermissionMode.SYSTEM_LEVEL); 

应该可以为我提供具有正确用户权限的keystoremanager。

问题是我找不到使用JNDI进行这项工作的方法!

是否可以执行此操作?或者您是否有人对如何以访客用户身份访问其他密钥库有想法?

付费偷看设置
发送
2条回答
Violet凡
1楼 · 2020-09-10 11:40.采纳回答

亲爱的巴斯蒂安,


该错误很可能向我显示以下内容:


正如我在您的自定义代码中看到的那样,您需要维护用户名和 密码:


<...> security.principal = <用户名> <...>命名.security.credentials = <密码> <...>


因此,您一定不要与Guest用户一起尝试该过程。 对您在上面的代码中维护的用户进行身份验证之后,可能会出现"用户来宾没有权限"错误。 身份验证失败(例如,安全会话过期)后,Java自动变为来宾用户,并且显然该用户将没有权限。


此外,我还能看到缺少的操作" IS_VIEW_EXISTS" 来宾用户身份验证错误的原因。 这也很明显,因为该用户没有这样的角色和动作。


因此,您可以执行以下操作:除了向Guest用户添加自定义角色(由于安全漏洞而不受支持)之外,您还需要查找为什么维护的用户(上文中提到) 代码)无法通过身份验证。 用户的安全会话可能已过期,然后成为来宾用户。


您可以按照SAP的说明通过打开TSHW"身份验证"跟踪来进行调查注意:1332726-故障排除向导->重现此问题- >关闭并下载跟踪->您可以根据时间戳和得到的错误进行调查。


最好的问候,
BarnabásPaksi

宇峰Kouji
2楼-- · 2020-09-10 11:37

很抱歉回到现在。

多亏了您的教程,我终于找到了我的错误。

我意识到,成功登录后不久,我的会话/用户就注销了,甚至在尝试访问任何密钥库之前。

因此,SAP系统似乎已默认返回给来宾用户。

我在代码中找不到任何显式的注销机制(应该完成所有操作后,连接已关闭)。

因此,通过反复试验,我发现,除了连接之外,还需要保持InitialContext Object在客户端保持打开状态。 否则,您的用户将立即注销。

在更改代码以在过程结束时关闭InitialContext以及它给我的连接后,一切正常!

一周热门 更多>