Java 由于索引处不透明部分中的非法字符,无法加载带有路径的密钥库类型 JKS

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/36206295/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 17:33:52  来源:igfitidea点击:

Failed to load keystore type JKS with path due to Illegal character in opaque part at index

javassltomcat7keystore

提问by SeanBob

I have recently started using Tomcat instead of WebLogic. I have completed setting up Tomcat and can access my application successfully via the non-ssl url. However, I cannot access the application via the ssl url (via https). The Tomcat log has an error I couldn't really find an answer to, so I'm hoping to find some help here. Thanks for any help, and please let me know if I need to provide anything else to make this more clear. -Sean My server.xml is configured as follows:

我最近开始使用 Tomcat 而不是 WebLogic。我已经完成了 Tomcat 的设置,并且可以通过非 ssl url 成功访问我的应用程序。但是,我无法通过 ssl url(通过 https)访问该应用程序。Tomcat 日志有一个错误,我真的找不到答案,所以我希望能在这里找到一些帮助。感谢您的帮助,如果我需要提供任何其他信息以使其更清楚,请告诉我。-Sean 我的 server.xml 配置如下:

    <?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the BIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile="C:\disk01\keystores" keystorePass="myPassWord" />

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

The tomcat log is showing the following:

tomcat 日志显示以下内容:

SEVERE: Failed to load keystore type JKS with path C:\disk01\keystores due to Illegal character in opaque part at index 2: C:\disk01\keystores java.lang.IllegalArgumentException: Illegal character in opaque part at index 2: C:\disk01\keystores at java.net.URI.create(Unknown Source) at java.net.URI.resolve(Unknown Source) ..... Caused by: java.net.URISyntaxException: Illegal character in opaque part at index 2: C:\disk01\keystores at java.net.URI$Parser.fail(Unknown Source) at java.net.URI$Parser.checkChars(Unknown Source) at java.net.URI$Parser.parse(Unknown Source) at java.net.URI.(Unknown Source) ... 27 more

Mar 23, 2016 5:05:55 PM org.apache.coyote.AbstractProtocol init SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-8443"] java.io.IOException: Failed to load keystore type JKS with path C:\disk01\keystores due to Illegal character in opaque part at index 2: C:\disk01\keystores at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getStore(JSSESocketFactory.java:453) at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeystore(JSSESocketFactory.java:344) ....

严重:由于索引 2 的不透明部分中存在非法字符,无法加载路径为 C:\disk01\keystores 的密钥库类型 JKS:C:\disk01\keystores java.lang.IllegalArgumentException:索引 2 的不透明部分中存在非法字符:C: \disk01\keystores at java.net.URI.create(Unknown Source) at java.net.URI.resolve(Unknown Source) ..... 引起:java.net.URISyntaxException:索引 2 处不透明部分中的非法字符: C:\disk01\keystores at java.net.URI$Parser.fail(Unknown Source) at java.net.URI$Parser.checkChars(Unknown Source) at java.net.URI$Parser.parse(Unknown Source) at java.net.URI.(Unknown Source) ... 27 more

2016 年 3 月 23 日下午 5:05:55 org.apache.coyote.AbstractProtocol init 严重:无法初始化与 ProtocolHandler ["http-bio-8443"] java.io.IOException 关联的端点:无法加载密钥库类型 JKS路径 C:\disk01\keystores 由于在索引 2 的不透明部分中存在非法字符:C:\disk01\keystores at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getStore(JSSESocketFactory.java:453) at org. apache.tomcat.util.net.jsse.JSSESocketFactory.getKeystore(JSSESocketFactory.java:344) ....

回答by James M

One other cause for this is that the file cannot be located by the JKS engine. Missing or incorrect characters are a main cause. It is best to copy/paste the path to the file from Windows Explorer or from a command prompt to the server.xml file.

另一个原因是 JKS 引擎无法定位该文件。缺少或不正确的字符是主要原因。最好将文件路径从 Windows 资源管理器或从命令提示符复制/粘贴到 server.xml 文件。

回答by Dezso Gabos

The correct way to specify the keystore file path in windows is in the following format (be aware of the forward slashes instead of the backslash): file:///C:/certs/trust-store/keystores

在 windows 中指定密钥库文件路径的正确方法是以下格式(注意正斜杠而不是反斜杠):file:///C:/certs/trust-store/keystores

When using it in the JAVA_OPTS, be aware, they will be set only as long as you are in the current terminal.

在 JAVA_OPTS 中使用它时,请注意,只要您在当前终端中,它们就会被设置。

set JAVA_OPTS=-Djavax.net.ssl.trustStore=file:////C:/apache-tomcat-7.0.91/certs/trust-store/keystores

设置 JAVA_OPTS=-Djavax.net.ssl.trustStore=file:////C:/apache-tomcat-7.0.91/certs/trust-store/keystores

As @coladict is not posting an answer, I took the liberty of posting this, as it is really useful.

由于@coladict 没有发布答案,我冒昧地发布了这个,因为它真的很有用。

回答by vinS

Env -

环境 -

OS : Window
Server : Tomcat 9
Java : 8u201 64bit

操作系统:窗口
服务器:Tomcat 9
Java:8u201 64bit

Tomcat Connector Setting -

Tomcat 连接器设置 -

<Connector port="8443"
    maxHttpHeaderSize="8192"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    SSLEnabled="true"
    URIEncoding="UTF-8" 
    keyAlias="cifin" 
    keystorePass="changeit" 
    keystoreFile=<SOME_SETTING> />

keystoreFile values -

keystoreFile 值 -

I was getting this error due to below settings in Tomcat's server.xml Connector -

由于 Tomcat 的 server.xml 连接器中的以下设置,我收到此错误 -

keystoreFile="file:\\%JAVA_HOME%\jre\lib\security\cacerts"

Then I have changed as below -

然后我已经改变如下 -

keystoreFile="file:\\C:\apps\Java\jdk1.8.0_201\jre\lib\security\cacerts"

But still getting the same error

但仍然得到同样的错误

Again, I have changed the setting to below, and it worked

再次,我已将设置更改为以下,并且有效

keystoreFile="file:///C:/apps/Java/8/jdk1.8.0_201/jre/lib/security/cacerts"

Note - Do not use %JAVA_HOME%in the location of keystoreFile

注意 - 请勿%JAVA_HOME%在以下位置使用keystoreFile