如何为HttpFS服务配置SSL

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢

1.文档编写目的


前面Fayson也介绍过《如何在集群外节点跨网段向HDFS写数据》和《如何使用Java代码访问HDFS》。在非Kerberos的环境中,使用HttpFS是不需要输入用户密码的,为了集群数据安全考虑可以考虑配置HttpFS的SSL。本篇文章主要介绍如何为HttpFS服务配置SSL。但Fayson依旧建议在开启HttpFS服务的集群里必须开启Kerberos。

  • 内容概述

1.生成Keystore文件

2.配置HttpFS服务SSL并验证

3.Java客户端访问及测试

4.总结

  • 测试环境

1.CentOS7.2

  • 前置条件

1.集群未启用Kerberos

2.生成KeyStore文件


在keystore里,包含两种数据:

  • 密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
  • 可信任的证书实体(trusted certificate entries)——只包含公钥

这里我们使用Java提供的Keytool证书管理工具来生成一个Keystore文件。

在部署了HttpFS服务的节点上,执行如下命令生成KeyStore文件

[root@cdh01 ~]# sudo -u httpfs /usr/java/jdk1.7.0_67-cloudera/bin/keytool -genkey -alias tomcat -keyalg RSA
Enter keystore password:  (输入密码)
Re-enter new password: (再次输入密码)
What is your first and last name?
  [Unknown]:  cdh01.macro.com
What is the name of your organizational unit?
  [Unknown]:  fayson
What is the name of your organization?
  [Unknown]:  fayson
What is the name of your City or Locality?
  [Unknown]:  fayson
What is the name of your State or Province?
  [Unknown]:  fayson
What is the two-letter country code for this unit?
  [Unknown]:  fason
Is CN=fayson, OU=cloudera, O=cloudera, L=shanghai, ST=shanghai, C=shanghai correct?
  [no]:  yes
Enter key password for <tomcat>
        (RETURN if same as keystore password):  (输入密码)
Re-enter new password: (再次输入密码)
[root@cdh01 ~]# 

(可左右滑动)

这里需要注意几个地方,需要输入密码和CN(CN必须为HttpFS服务所在节点的hostname)。

执行成功后证书文件默认生成在/var/lib/hadoop-httpfs目录下的 .keystore文件:

完成证书文件的生成后,接下来通过ClouderaManager界面为HttpFS服务配置SSL。

3.配置SSL


1.使用管理员用户登录Cloudera Manager的WEB界面

进入HDFS服务配置页面,范围选择“HttpFS”,类别选择“安全性”

2.配置启用SSL和Keystore文件

保存配置,回到CM主页根据提示重启相应服务。

4.验证配置是否生效


1.浏览器验证是否能正常访问HDFS文件列表,查看HDFS根目录下所有文件

请求成功,使用的是https

2.通过curl查看是否正常访问

[root@cdh01 ~]# curl -k "https://192.168.10.4:14000/webhdfs/v1/?op=liststatus&user.name=hdfs"

(可左右滑动)

5.Java客户端访问


1.将HttpFS服务器上的.keystore证书下载至本地命名为httpfs.keystore

2.使用Maven创建一个java工程,pom.xml文件中增加如下依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.4</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.5.4</version>
</dependency>

(可左右滑动)

3.编写访问HttpFS的示例代码

package com.cloudera.hdfs.nonekerberos;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
/**
 * package: com.cloudera.hdfs.nonekerberos
 * describe: Java使用HttpClient访问启用SSL的HttpFS服务
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2018/1/13
 * creat_time: 下午9:56
 * 公众号:Hadoop实操
 */
public class HttpFSSSLDemo {
    private static String HTTPFS_HOST = "cdh01.macro.com";
    public static void main(String[] args) {
        try{
            SSLContext sslcontext = SSLContexts.custom()
                    .loadTrustMaterial(new File("/Volumes/Transcend/keytab/ssl/httpfs-server.keystore"), "123456".toCharArray(), new TrustSelfSignedStrategy()).build();
            // Allow TLSv1 protocol only
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                    sslcontext,
                    new String[] { "TLSv1" },
                    null,
                    SSLConnectionSocketFactory.getDefaultHostnameVerifier());
            CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
            System.out.println("===========Case No.1  List resources==========");
            String getRequest =  "https://" + HTTPFS_HOST + ":14000/webhdfs/v1/?op=liststatus&user.name=hdfs";
            HttpGet httpget = new HttpGet(getRequest);
            System.out.println("executing request " + httpget.getRequestLine());
            CloseableHttpResponse response = httpclient.execute(httpget);
            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            HttpEntity entity = response.getEntity();
            BufferedReader br =
                    new BufferedReader(new InputStreamReader((entity.getContent())));
            String output;
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(可左右滑动)

4.示例运行结果

6.常见问题


运行时报如下异常

javax.net.ssl.SSLPeerUnverifiedException: Certificate for <114.119.11.142> doesn't match any of the subject alternative names: []
   at org.apache.http.conn.ssl.SSLConnectionSocketFactory.verifyHostname(SSLConnectionSocketFactory.java:467)
   at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:397)
   at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355)
   at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
   at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:373)
   at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
   at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
   at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
   at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
   at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
   at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
   at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
   at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
   at com.cloudera.hdfs.nonekerberos.HttpFSSSLDemo.main(HttpFSSSLDemo.java:50)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:483)
   at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

(可左右滑动)

异常原因:

1.在生成keystore文件时未指定CN为HttpFS服务所在节点的hostname

2.直接访问HttpFS服务的IP地址导致,需要配置hosts文件

7.总结


  • 在生成HttpFS服务的keystore文件时CN信息必须为该服务的hostsname,否则会报错
  • 在访问时需要配置本地的hosts文件

GitHub地址:

https://github.com/fayson/cdhproject/blob/master/hdfsdemo/src/main/java/com/cloudera/hdfs/nonekerberos/HttpFSSSLDemo.java

提示:代码块部分可以左右滑动查看噢 为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏水击三千

Android学习之Notification

Notification可以在手机的状态栏发出一则通知,它需要用NotificationManager来管理,实现Notification其实很简单。 1.通过...

26190
来自专栏菩提树下的杨过

CKEditor/CKFinder升级心得

这几天把一个旧项目中的fckeditor升级为ckeditor 3.2 + ckfinder 1.4.3 组合,下面是一些升级心得: 一、CKFinder的若干...

39370
来自专栏比原链

剥开比原看代码10:比原是如何通过/create-key接口创建密钥的

Gitee地址:https://gitee.com/BytomBlockchain/bytom

13720
来自专栏开源优测

RFC821 简单邮件传输协议(SMTP)

15230
来自专栏LanceToBigData

Hadoop(十)Hadoop IO之数据完整性

前言   上一篇我分享了Hadoop的压缩和编解码器,在我们开发的过程中其实是经常会用到的,所以一定要去掌握。这一篇给大家介绍的是Hadoop的数据完整性!  ...

23450
来自专栏Netkiller

Linux磁盘分区加密

本文节选自《Netkiller Cryptography 手札》 出处: http://netkiller.github.io/cryptography/ind...

45740
来自专栏用户2442861的专栏

Qt 打开文件的默认路径 QFileDialog::getOpenFileName()

为了说明QFileDialog::getOpenFileName()函数的用法,还是先把函数签名放在这里:

20710
来自专栏知识分享

关于STM32 IAP

转眼间天亮了...... 然后就想起了一个朋友QQ的个性签名:年轻人总是要为一些自己认为有意义的事情而废寝忘食,通宵达旦,直至白发方休........ 对了这篇...

62940
来自专栏小灰灰

报警系统QuickAlarm使用手册

本片将主要说明QuickAlarm该如何使用,以及使用时需要注意事项 1. 基本使用姿势 首先我们不做任何的自定义操作,全部依靠系统默认的实现,我们的使用步骤如...

441160
来自专栏企鹅号快讯

linux etc下 passwd、shadow和group文件详解

在linux操作系统中, /etc/passwd文件中的每个用户都有一个对应的记录行,记录着这个用户的一下基本属性。该文件对所有用户可读。 /etc/shado...

26490

扫码关注云+社区

领取腾讯云代金券