繁体   English   中英

使用安全的RESTful API

[英]Consuming Secure RESTful API

我需要构建一个使用来自外部公司的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;
}

这是我的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;
    }

我对我需要做的一切感到困惑,如果需要的话,它需要包括一个SSL证书,并对数据进行加密/解密。 外部站点是否在不要求SSL证书的情况下返回了看似未加密的信息是否有问题?

我对SSL不熟悉,而对REST来说相对较新,所以请原谅我对此主题的无知。 可以提供的任何帮助或我可以引导的资源将不胜感激!

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

如果指定HTTPS URL,则JRE将始终尝试建立加密连接。 如果它不起作用,则会出现异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM