Websphere 6.1 で HTTPS を強制する
質問
Http を使用してページをリクエストしたユーザーに、安全な https バージョンの使用を強制するにはどうすればよいでしょうか?
アプリケーションサーバーとして Websphere 6.1 を使用し、開発環境として Rad 7 を使用しています。
ありがとうダミアン
解決
これをサーバー構成ではなくアプリケーション内で行う 1 つの方法は、 フィルター (web.xml で指定) かどうかを確認します。 ServletRequest.getScheme()
「http」または「https」である場合、ユーザーを適切な URL にリダイレクトします ( HttpServletResponse.sendRedirect(String url)
).
他のヒント
web.xml に次のエントリを追加すると、すべてのリクエストが https に変換されます。
<!--********************************
*** SSL Security Constraint ***
*****************************-->
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!--********************************* -->
Websphere は完全な http サーバーではありません。HTTP サーバーのように機能する「トランスポート チェーン」があります。
通常、HTTP サーバーを前に置きます。IBM は、Apache HTTP Server を軽く変更した IHS (IBM HTTP Server) を提供しています。HTTP サーバーは httpd.conf ファイルで構成されます。そこで、http のリクエストが https にリダイレクトされるような方法でリダイレクトを追加します。
インフラストラクチャに関する詳細情報を提供できるかもしれません。
同意します。フィルターを使用するとこれが実現すると思います。これは負荷分散とポート リダイレクト用に作成したフィルターですが、ニーズに合わせて編集する方法を理解するのは簡単です。
public class RequestWrapperFilter はフィルターを実装します {
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
String requestWrapperClassName = (String) (httpRequest
.getAttribute(LoadBalancerRequestWrapper.class.getName()));
String initiatingServerName = httpRequest.getServerName();
if (requestWrapperClassName == null
&& initiatingServerName.equals(loadBalancerHostName)) {
httpRequest = new LoadBalancerRequestWrapper(AuthenticationUtil
.getHttpServletRequest(httpRequest));
}
filterChain.doFilter(httpRequest, httpResponse);
}
}
/**
* The custom implementation of the request wrapper. It simply overrides the
* getScheme() and getServerPort() methods to perform the redirect
* filtering.
*
*
*/
private static class LoadBalancerRequestWrapper extends
HttpServletRequestWrapper {
/**
* Default Constructor. Simply declares the Wrapper as injected.
*
* @param httpServletRequest
* the app-server HttpServletRequest.
*
*/
public LoadBalancerRequestWrapper(HttpServletRequest httpServletRequest) {
super(httpServletRequest);
}
/**
* The overridden scheme.
*
*/
public final String getScheme() {
if (loadBalancerHttpScheme.equals(EMPTY_STRING)) {
return super.getScheme();
}
return loadBalancerHttpScheme;
}
}
}