我有一个试图发出以下请求的Tomcat Java应用程序:
https://www.googleapis.com/oauth2/v4/token?scope=profile+email
我看到它何时尝试写入失败的连接。
conn.getOutputStream().write(content);
其中写入正文的内容是上面显示的数据。它会引发以下错误:
java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
当我将Fiddler连接到Tomcat时,我可以看到在成功发送之前的请求:https://accounts.google.com/o/oauth2/v2/auth 但我实际上从未在Fiddler中看到下一个发送到URL的请求失败:https://www.googleapis.com/oauth2/v4/token
基于此以及它打印的消息,在准备要发送的数据时似乎失败了。
问题听起来像SSL和证书。 我下载了URL https://www.googleapis.com/oauth2/v4/token的两个证书,并将它们安装到第一个Tomcat的密钥库,然后安装到信任库。 (首先将它添加到密钥库中,当它没有工作时,我添加到trustsstore。 这并没有解决问题。
由于我记录了正在写入输出流的数据,因此我尝试从日志文件中手动复制请求正文数据,包括从Google返回的代码并将其粘贴到Chrome扩展程序中#34 ;休息控制台"。 当我这样做它有效。但我发现Chrome已经为https://www.googleapis.com安装了证书,所以也许这就是浏览器请求工作的原因。
在此代码的oAuth1版本中,我认为我们不需要安装证书。此外,当我从Google oAuth2运行Java示例时,除非证书以某种方式与Jetty打包在一起,否则我不会看到它们已安装。所以,我并不认为证书是问题所在。
在Tomcat中,我尝试通过在Tomcat JVM启动中添加以下内容来启用SSL调试:
-Djavax.net.debug=ssl,session,defaultctx,trustmanager,keymanager
它写了很多信息,但是在发生错误之前没有写任何内容。
如何确定错误?
=================================
这是堆栈跟踪:
2018-03-19 08:32:11,324 DEBUG [scribe.model.Request] [http-bio-8080-exec-11]
java.security.NoSuchAlgorithmException: Error constructing implementation
(algorithm: Default, provider: SunJSSE, class:
sun.security.ssl.SSLContextImpl$DefaultSSLContext)
2018-03-19 08:32:11,324 DEBUG [scribe.model.Request] [http-bio-8080-exec-11]
java.lang.Throwable:
at org.scribe.model.Request.addBody(Request.java:153)
at org.scribe.model.Request.doSend(Request.java:113)
at org.scribe.model.Request.send(Request.java:69)
at org.scribe.model.OAuthRequest.send(OAuthRequest.java:12)
at org.scribe.oauth.OAuth20ServiceImpl.getAccessToken(OAuth20ServiceImpl.java:38)
at ch.gadp.alfresco.OAuthSSOAuthenticationFilter.getUserProfile(OAuthSSOAuthenticationFilter.java:192)
at ch.gadp.alfresco.OAuthSSOAuthenticationFilter.processRequestToken(OAuthSSOAuthenticationFilter.java:331)
at ch.gadp.alfresco.OAuthSSOAuthenticationFilter.doOAuthAuthentication(OAuthSSOAuthenticationFilter.java:375)
at ch.gadp.alfresco.OAuthSSOAuthenticationFilter.doFilter(OAuthSSOAuthenticationFilter.java:428)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)