Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用安全的RESTful API_Java_Spring_Ssl - Fatal编程技术网

Java 使用安全的RESTful API

Java 使用安全的RESTful API,java,spring,ssl,Java,Spring,Ssl,我需要构建一个使用外部公司提供的RESTful API的应用程序。我正在使用的数据是敏感的,因此它显然需要HTTPS 我的问题是,我能够从外部公司读取信息,而无需配置任何类型的SSL证书。我不必在代码中进行任何类型的加密/解密 我唯一能让我相信数据是安全的,那就是RESTful调用只对URL中的https有效,而不是http 我正在使用Spring RestTemplate使用web服务,如下所示: List<Info> getInfo(Map<String, Object&g

我需要构建一个使用外部公司提供的RESTful API的应用程序。我正在使用的数据是敏感的,因此它显然需要HTTPS

我的问题是,我能够从外部公司读取信息,而无需配置任何类型的SSL证书。我不必在代码中进行任何类型的加密/解密

我唯一能让我相信数据是安全的,那就是RESTful调用只对URL中的
https
有效,而不是
http

我正在使用Spring RestTemplate使用web服务,如下所示:

List<Info> getInfo(Map<String, Object> urlParamMap, HttpSession httpSession){
    HttpEntity<String> request = new HttpEntity<String>(httpSession.getHttpHeaders());
    restTemplate.setMessageConverters(httpSession.getMessageConverterList());

    ResponseEntity<JsonData> responseEntity = restTemplate.exchange("https://outsideOrg.com/{parameter}, HttpMethod.GET, request, JsonData.class, urlParamMap);

    List<Info> infoList = responseEntity.getBody().getInfoList();

    return infoList;
}
List getInfo(映射urlParamMap,HttpSession-HttpSession){
HttpEntity请求=新的HttpEntity(httpSession.getHttpHeaders());
setMessageConverters(httpSession.getMessageConverterList());
ResponseEntity ResponseEntity=restTemplate.exchange(“https://outsideOrg.com/{parameter},HttpMethod.GET,request,JsonData.class,urlParamMap);
List infoList=responseEntity.getBody().getInfoList();
返回信息列表;
}
这是我的一些http设置,包括授权和一些反序列化设置:

public class HttpSession {

    static Logger log = Logger.getLogger(HttpSession.class);

    private HttpHeaders httpHeaders;
    private List<HttpMessageConverter<?>> messageConverterList;

    HttpHeaders getHttpHeaders() {
        return httpHeaders;
    }

    void setHttpHeaders(HttpHeaders httpHeaders) {
        this.httpHeaders = httpHeaders;
    }

    List<HttpMessageConverter<?>> getMessageConverterList() {
        return messageConverterList;
    }

    void setMessageConverterList(List<HttpMessageConverter<?>> messageConverterList) {
        this.messageConverterList = messageConverterList;
    }

    void createHeaders(){
        HttpHeaders httpHeaders = new HttpHeaders();  
        try {
            File xmlFile = new File("C:/Users/User/docs/RestAuth.xml");
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuilder.parse(xmlFile);

            String username = document.getElementsByTagName("username").item(0).getTextContent();
            String password = document.getElementsByTagName("password").item(0).getTextContent(); 

            String authorization = username + ":" + password;
            byte[] encodedAuthorization = Base64.encodeBase64(authorization.getBytes(Charset.forName("US-ASCII")));   
            String authorizationHeader = "Basic " + new String(encodedAuthorization);

            httpHeaders.set("Authorization", authorizationHeader);
            httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

        }catch (ParserConfigurationException | SAXException | IOException e) {
            log.error("There was an error setting the credentials.", e);
        }
        this.httpHeaders = httpHeaders;
    }      

    void setupMessageConverters(){
        List<HttpMessageConverter<?>> messageConverterList = new ArrayList<>();
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        messageConverter.setObjectMapper(objectMapper);
        messageConverterList.add(messageConverter);

        this.messageConverterList = messageConverterList;
    }
公共类HttpSession{
静态记录器log=Logger.getLogger(HttpSession.class);
私有HttpHeaders HttpHeaders;
私有列表>getMessageConverterList(){
返回消息转换列表;
}

void setMessageConverterList(ListJRE包含一个信任存储区,其中包含某些公共CA的证书。如果公司使用由一个受信任CA签名的证书,JRE可以建立SSL连接,而无需任何进一步配置。否则,您将收到一条错误消息,表明该证书不受信任


如果指定HTTPS url,JRE将始终尝试设置加密连接。如果不起作用,则会出现异常。

JRE包含一个信任存储区,其中包含某些公共CA的证书。如果公司使用一个由其中一个受信任CA签名的证书,JRE可以建立SSL连接,而无需进一步验证否则您将收到一条错误消息,该证书不受信任


如果指定HTTPS url,JRE将始终尝试设置加密连接。如果不起作用,则会出现异常。

另外,我还有一个问题:由于我没有配置SSL证书,这是否意味着我从中获取信息的服务器没有检查证书?我的组织应该是打开的只有一家公司获得此信息,因此,如果外部组织只是将信息提供给可能知道URL和用户名/密码的任何人,我需要解决一个问题。使用SSL,服务器不检查任何证书,客户端检查。服务器提供证书,客户端检查证书是否为TRUted。在你的情况下是这样的。所以连接是加密的。另一点是身份验证。你使用用户名和密码,这是一种身份验证。你也可以使用客户端证书,但你必须进行一些配置。虽然我不认为你在这里有用户名和密码的问题。当然,如果有人有username和密码,他可以访问该API,这就是用户名和密码的全部意义。这就是为什么你必须对凭据保密。如果你将凭据泄露给其他人,那就是你的责任。此外,我还有一个问题:既然我不配置SSL证书,这是否意味着我是ge的服务器从中获取信息不是在检查证书吗?我的组织应该是唯一获取此信息的组织,因此,如果外部组织只是将信息发送给可能知道URL和用户名/密码的任何人,我需要解决一个问题。使用SSL,服务器不会检查任何证书ate,你的客户端有。你的服务器提供一个证书,客户端检查它是否可信。在你的情况下,它是可信的。因此连接是加密的。另一点是身份验证。你使用用户名和密码,这是一种身份验证。你也可以使用客户端证书,但你必须进行一些配置。虽然我没有请在此查看用户名和密码的问题。当然,如果有人有用户名和密码,他就可以访问该API,这就是用户名和密码的全部意义。这就是为什么你必须将凭据保密。如果你将它们泄露给其他人,那就是你的责任。