Clojure &引用;SSL不';“没有有效的密钥库”;尝试连接到Datomic Cloud时出错

Clojure &引用;SSL不';“没有有效的密钥库”;尝试连接到Datomic Cloud时出错,clojure,jetty,datomic,Clojure,Jetty,Datomic,我正试图转换一个项目来使用新的。我已经通过AWS仪表板创建了这个堆栈,甚至可以通过一个简单的clojure repl连接到它,并具有所需的依赖项。但我一直很难从我的项目中获得工作上的联系 起初,我遇到了一系列依赖性冲突——实际上,这可能仍然是这里的根本问题——因此我在我的项目中包含datomic项目时添加了一些排除项。clj: [com.datomic/client-cloud "0.8.50" :exclusions [org.eclipse.jetty/jetty-io

我正试图转换一个项目来使用新的。我已经通过AWS仪表板创建了这个堆栈,甚至可以通过一个简单的clojure repl连接到它,并具有所需的依赖项。但我一直很难从我的项目中获得工作上的联系

起初,我遇到了一系列依赖性冲突——实际上,这可能仍然是这里的根本问题——因此我在我的
项目中包含datomic项目时添加了一些排除项。clj

 [com.datomic/client-cloud "0.8.50"
  :exclusions [org.eclipse.jetty/jetty-io
               org.eclipse.jetty/jetty-util
               commons-logging
               commons-codec]]
然后,当我试图在
lein repl
中与

(require '[datomic.client.api :as d])
(def cfg {:server-type :cloud
          :region "us-east-2"
          :system "<sysname>"
          :query-group "<sysname>"
          :endpoint "http://entry.<sysname>.us-east-2.datomic.net:8182/"
          :proxy-port 8182})
(def client (d/client cfg))
(需要“[datomic.client.api:as d])
(def cfg{:服务器类型:云)
:地区“美国东部-2”
:系统“”
:查询组“”
:端点“http://entry..us-east-2.datomic.net:8182/"
:代理端口8182})
(def客户端(d/客户端cfg))
我最后犯了以下错误:

2018-05-13 20:36:01.593:警告:oejuc.抽象生命周期:nREPL-worker-1:失败SslContextFactory@56f447c4(null,null):java.lang.IllegalStateException:SSL没有有效的密钥库> java.lang.IllegalStateException:SSL没有有效的密钥库`


这件事难倒我了。这是一个具有完整堆栈跟踪的粘贴箱:。我猜可能是jetty的错误版本出现了问题,但我不确定下一步该怎么做。想法?

根据@Aleph-Aleph在对上述问题的评论中提出的建议,我找到了解决方案。我所做的是向与
datomic/cloud-client
冲突的依赖项的包中添加排除项

我通过更仔细地查看
lein deps:tree | grep jetty
来查看这些冲突。它特别表明了以下几点:

[ring "1.6.3" :exclusions [org.eclipse.jetty/jetty-client org.eclipse.jetty/jetty-http org.eclipse.jetty/jetty-util]] -> [ring/ring-jetty-adapter "1.6.3"] -> [org.eclipse.jetty/jetty-server "9.2.21.v20170120"] -> [org.eclipse.jetty/jetty-
io "9.2.21.v20170120"]
 overrides
[com.datomic/client-cloud "0.8.50"] -> [com.datomic/client "0.8.40"] -> [com.datomic/client-impl-shared "0.8.34"] -> [com.cognitect/http-client "0.1.83"] -> [org.eclipse.jetty/jetty-client "9.3.7.v20160115"] -> [org.eclipse.jetty/jetty-io
 "9.3.7.v20160115"]
 and
[com.datomic/client-cloud "0.8.50"] -> [com.datomic/client-impl-shared "0.8.34"] -> [com.cognitect/http-client "0.1.83"] -> [org.eclipse.jetty/jetty-client "9.3.7.v20160115"] -> [org.eclipse.jetty/jetty-io "9.3.7.v20160115"]
 and
[com.datomic/client-cloud "0.8.50"] -> [com.datomic/client "0.8.40"] -> [com.cognitect/http-client "0.1.83"] -> [org.eclipse.jetty/jetty-client "9.3.7.v20160115"] -> [org.eclipse.jetty/jetty-io "9.3.7.v20160115"]
很明显,来自
ring
的依赖项称为
ring/ring-jetty-adapter
包含一些包版本,这些包版本覆盖了datomic云中的包版本。因此,我添加了以下内容,以解决问题:

[ring "1.6.3"
 :exclusions [ring/ring-jetty-adapter]]

如果您为
jetty服务器
jetty客户端
指定了较新的依赖项版本,它最终应该可以工作。 这就是我的工作原理:

:dependencies [[org.clojure/clojure "1.9.0"]
             [ring/ring-core "1.7.0-RC1"]
             [ring/ring-jetty-adapter "1.7.0-RC1"]
             [org.eclipse.jetty/jetty-server "9.4.9.v20180320"] 
             [org.eclipse.jetty/jetty-client "9.4.9.v20180320"] 
             [com.datomic/client-cloud "0.8.52"]]

有关完整的演示,请参见

我的解决方法是使用alter var root+替换ssl上下文工厂实现,以使用以下依赖项:

org.eclipse.jetty/jetty-http         {:mvn/version "9.2.24.v20180105"}
org.eclipse.jetty/jetty-io           {:mvn/version "9.2.24.v20180105"}
org.eclipse.jetty/jetty-util         {:mvn/version "9.2.24.v20180105"}
org.eclipse.jetty/jetty-client       {:mvn/version "9.2.24.v20180105"}
缺点是现在它信任一切,但也许可以找到一些最佳配置

   (defn ssl-context-factory-replacement
      ^SslContextFactory [{:keys [trust-all classpath-trust-store trust-store-password trust-store validate-hostnames]}]
      (SslContextFactory. true))`enter code here`

    (alter-var-root
     #'cognitect.http-client/ssl-context-factory
     (constantly ssl-context-factory-replacement))

我会尝试不在
com.datomic/client cloud
中排除Jetty,而是在其他需要它的依赖项中排除Jetty,这样您就可以得到一个可与datomic cloud相比的Jetty版本。我并不完全理解您的意思。有没有可能提供一个简短的示例?运行
leindeps:tree
查看哪些库需要Jetty。然后,将
[org.eclipse.jetty/jetty-io org.eclipse.jetty/jetty util]
从问题文本中列出的
com.datomic/client cloud
依赖项的排除项中删除,并为依赖jetty的其他库添加这些排除项。好的,我来试一试。这一变化的影响是datomic云库指定的jetty包的版本会被优先考虑吗?结果证明这并没有解决我的问题。我只考了一个repl。码头的排除破坏了环形服务器。因此,我回来尝试解决依赖冲突。在上面的输出中,您似乎从
ring
获得了
jetty io
依赖关系。如果这不是您想要的,那么将此工件添加到
:exclusions
向量中。可能一个不太容易出错的选项是完全放弃排除,并使用正确的版本声明对
环形/环形码头适配器的显式依赖关系(在
项目.clj
)(我猜
9.3.7.v20160115
或与datomic兼容的类似产品)+1.这对我来说很有用。我不喜欢在我的deps向量中存在我的应用程序不直接需要的依赖项,但哦,好吧。