使用Java,通过HTTPS使用Web服务很容易,但是如何发布一个?
标准的JAX-WS实现不支持它。我们尝试了Jetty,但是Jetty不支持基于HTTPS的Web服务(JettyHttpServerProvider
的{{1}}抛出createHttpsServer()
)。我认为这个问题应该很简单。但不知怎的,我总是在墙上奔跑。
此外这必须与OSGi一起使用所以我更喜欢大多数或所有依赖项都可以作为捆绑包使用。目前我尝试运行CXF,但它有很多非OSGi依赖项,这使得部署非常困难。
我们还需要通过证书进行客户端身份验证,但我希望一旦启用HTTPS,这将相对容易。
为什么这么重要?例如,要为Jetty提供静态内容,您只需创建一个服务器,添加任何SSL连接器即可。为什么Web服务不那么容易?
答案 0 :(得分:1)
如果您使用的是spring,则可以使用以下配置。这个article on FuseSource很好地解释了配置所需的步骤。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://cxf.apache.org/configuration/security"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:httpj="http://cxf.apache.org/transports/http-
jetty/configuration"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xsi:schemaLocation="
http://cxf.apache.org/configuration/security http:
//cxf.apache.org/schemas/configuration/security.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/transports/http-jetty/configuration
http://cxf.apache.org/schemas/configuration/http-jetty.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-
2.0.xsd">
<http:destination name="{http://package}AnInterfacePort.http-
destination">
</http:destination>
<httpj:engine-factory bus="cxf">
<httpj:engine port="9001">
<httpj:tlsServerParameters>
<sec:keyManagers keyPassword="password">
<sec:keyStore type="JKS" password="password"
file="C:/certs/cherry.jks"/>
</sec:keyManagers>
<sec:trustManagers>
<sec:keyStore type="JKS" password="password"
file="C:/certs/truststore.jks"/>
</sec:trustManagers>
<sec:cipherSuitesFilter>
<!-- these filters ensure that a ciphersuite with
export-suitable or null encryption is used,
but exclude anonymous Diffie-Hellman key change as
this is vulnerable to man-in-the-middle attacks -->
<sec:include>.*_EXPORT_.*</sec:include>
<sec:include>.*_EXPORT1024_.*</sec:include>
<sec:include>.*_WITH_DES_.*</sec:include>
<sec:include>.*_WITH_NULL_.*</sec:include>
<sec:exclude>.*_DH_anon_.*</sec:exclude>
</sec:cipherSuitesFilter>
<sec:clientAuthentication want="true" required="true"/>
</httpj:tlsServerParameters>
</httpj:engine>
</httpj:engine-factory>
<!-- We need a bean named "cxf" -->
<bean id="cxf" class="org.apache.cxf.bus.CXFBusImpl"/>
</beans>
答案 1 :(得分:1)
我们的系统在OSGi中使用cxf和jetty,它可以在HTTPS中正常工作。
将服务发布到WebService时,不应该关注它是HTTP还是HTTPS。通过将以下属性传递给OSGi来配置您的jetty以支持HTTPS:
org.eclipse.equinox.http.jetty.http.enabled=false
org.eclipse.equinox.http.jetty.https.enabled=true
org.eclipse.equinox.http.jetty.https.port=443
org.eclipse.equinox.http.jetty.ssl.keystore=...
org.eclipse.equinox.http.jetty.ssl.password=...
您可以查看
中的其他属性org.eclipse.equinox.http.jetty_2.0.0.v20100503.jar\OSGI-INF\metatype\config.xml
通过这样做,您可以尝试使用IE通过https访问服务的wsdl。