
# 配置SDK验证服务端证书（C SDK）
![](https://support.huaweicloud.com/sdk-c-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在GitHub上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-c-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。
OBS C SDK提供了对服务端证书验证的支持，以确保OBS服务来自于受信服务端。配置验证服务端证书的步骤如下：
![](https://support.huaweicloud.com/sdk-c-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
如果访问的OBS服务端的根证书是由权威机构颁发的，可以忽略步骤1、2（C SDK的证书库中默认已加入了权威机构的根证书）。
1. 获取OBS服务端的根证书并保存为文件。例如：在浏览器的地址栏单击锁图标 \> 证书 \> 详细信息 \> 导出；或在Windows中通过 certmgr.msc 证书管理器导出。
2. 将证书文件放置到可执行文件所在目录。使用 OBS_DEFAULT_CERTIFICATE 时，Linux 环境下证书文件名须为 client.pem，Windows 环境下须为 client.crt；使用 OBS_DEFINED_CERTIFICATE 时，可在调用 init_certificate_by_path 时通过 path 参数指定任意路径。
3. 应用程序使用https协议通信，接口调用方法参考[HTTPS服务接口使用方法]。
 #### HTTPS服务接口使用方法
方式一：通过证书路径配置（init_certificate_by_path）
在 init_obs_options之前调用init_certificate_by_path实现https通信，根证书路径通过参数指定或者使用系统默认证书。
参数解释
| **参数名称**    | **参数类型**             | **是否必选**                                 | **描述**                                                                      |
|:---|:---|:---|:---|
| protocol    | obs_protocol         | 必选                                       | 协议参数。值为OBS_PROTOCOL_HTTPS或OBS_PROTOCOL_HTTP                                 |
| ca_conf     | obs_certificate_conf | 可选，如果protocol为OBS_PROTOCOL_HTTPS则为必选     | 证书配置策略。值为OBS_NO_CERTIFICATE、OBS_DEFAULT_CERTIFICATE或OBS_DEFINED_CERTIFICATE |
| path        | char \*              | 可选，如果ca_conf为OBS_DEFINED_CERTIFICATE则为必选 | 证书路径                                                                        |
| path_length | int                  | 可选，如果path不为NULL则为必选                      | 证书路径长度                                                                      |
   
代码示例
```
obs_options options;
obs_status ret_status;
// 示例1: HTTP通信，不验证证书
ret_status = init_certificate_by_path(OBS_PROTOCOL_HTTP, OBS_NO_CERTIFICATE, NULL, 0);
if (OBS_STATUS_OK != ret_status)
{
    printf("init_certificate_by_path failed(%s).\n", obs_get_status_name(ret_status));
    return -1;
}
init_obs_options(&options);
// 示例2: HTTPS通信，使用默认证书（lib目录下的client.pem）
ret_status = init_certificate_by_path(OBS_PROTOCOL_HTTPS, OBS_DEFAULT_CERTIFICATE, NULL, 0);
if (OBS_STATUS_OK != ret_status)
{
    printf("init_certificate_by_path failed(%s).\n", obs_get_status_name(ret_status));
    return -1;
}
init_obs_options(&options);
// 示例3: HTTPS通信，指定证书路径
const char *cert_path = "/path/to/obs.cer";
ret_status = init_certificate_by_path(OBS_PROTOCOL_HTTPS, OBS_DEFINED_CERTIFICATE, cert_path, strlen(cert_path));
if (OBS_STATUS_OK != ret_status)
{
    printf("init_certificate_by_path failed(%s).\n", obs_get_status_name(ret_status));
    return -1;
}
init_obs_options(&options);
```
方式二：通过证书内容配置（init_certificate_by_buffer）
在init_obs_options之前调用init_certificate_by_buffer实现https通信，直接传入证书内容。
参数解释
| **参数名称**      | **参数类型** | **是否必选** | **描述** |
|:---|:---|:---|:---|
| buffer        | char \*  | 必选       | 证书内容   |
| buffer_length | int      | 必选       | 证书内容长度 |
   
代码示例
```
obs_options options;
obs_status ret_status;
// 读取证书内容到buffer（示例省略读取逻辑）
const char *ca_buffer = "...";  // 证书内容
int buffer_length = strlen(ca_buffer);
ret_status = init_certificate_by_buffer(ca_buffer, buffer_length);
if (OBS_STATUS_OK != ret_status)
{
    printf("init_certificate_by_buffer failed(%s).\n", obs_get_status_name(ret_status));
    return -1;
}
init_obs_options(&options);
```
