25 #if defined(GPR_LINUX) || defined(GPR_ANDROID) || defined(GPR_FREEBSD) || \
32 #include <sys/param.h>
48 "Custom directory to SSL Roots");
53 #if defined(GPR_LINUX) || defined(GPR_ANDROID)
54 const char* kCertFiles[] = {
55 "/etc/ssl/certs/ca-certificates.crt",
"/etc/pki/tls/certs/ca-bundle.crt",
56 "/etc/ssl/ca-bundle.pem",
"/etc/pki/tls/cacert.pem",
57 "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"};
58 const char* kCertDirectories[] = {
59 "/etc/ssl/certs",
"/system/etc/security/cacerts",
"/usr/local/share/certs",
60 "/etc/pki/tls/certs",
"/etc/openssl/certs"};
61 #elif defined(GPR_FREEBSD) // endif GPR_LINUX || GPR_ANDROID
62 const char* kCertFiles[] = {
"/etc/ssl/cert.pem",
63 "/usr/local/share/certs/ca-root-nss.crt"};
64 const char* kCertDirectories[] = {
""};
65 #elif defined(GPR_APPLE) // endif GPR_FREEBSD
66 const char* kCertFiles[] = {
"/etc/ssl/cert.pem"};
67 const char* kCertDirectories[] = {
""};
73 for (
size_t i = 0;
i < num_cert_files_;
i++) {
77 return valid_bundle_slice;
87 void GetAbsoluteFilePath(
const char* valid_file_dir,
88 const char* file_entry_name,
char* path_buffer) {
89 if (valid_file_dir !=
nullptr && file_entry_name !=
nullptr) {
90 int path_len = snprintf(path_buffer, MAXPATHLEN,
"%s/%s", valid_file_dir,
99 grpc_slice CreateRootCertsBundle(
const char* certs_directory) {
101 if (certs_directory ==
nullptr) {
104 DIR* ca_directory = opendir(certs_directory);
105 if (ca_directory ==
nullptr) {
109 char path[MAXPATHLEN];
112 std::vector<FileData> roots_filenames;
113 size_t total_bundle_size = 0;
114 struct dirent* directory_entry;
115 while ((directory_entry = readdir(ca_directory)) !=
nullptr) {
116 struct stat dir_entry_stat;
117 const char* file_entry_name = directory_entry->d_name;
119 GetAbsoluteFilePath(certs_directory, file_entry_name,
file_data.path);
121 if (stat_return == -1 || !S_ISREG(dir_entry_stat.st_mode)) {
123 if (stat_return == -1) {
132 closedir(ca_directory);
133 char* bundle_string =
static_cast<char*
>(
gpr_zalloc(total_bundle_size + 1));
135 for (
size_t i = 0;
i < roots_filenames.size();
i++) {
136 int file_descriptor =
open(roots_filenames[
i].
path, O_RDONLY);
137 if (file_descriptor != -1) {
139 size_t cert_file_size = roots_filenames[
i].size;
141 read(file_descriptor, bundle_string +
bytes_read, cert_file_size);
142 if (read_ret != -1) {
157 if (strlen(custom_dir.get()) > 0) {
158 result = CreateRootCertsBundle(custom_dir.get());
163 result = GetSystemRootCerts();
167 result = CreateRootCertsBundle(kCertDirectories[
i]);