diff --git a/includes/push_notifications.admin.inc b/includes/push_notifications.admin.inc
index c481e81dc6482a080c92fb35be545ce6e831f241..82ae133568753ede82ed855581b217df6cd65cf9 100644
--- a/includes/push_notifications.admin.inc
+++ b/includes/push_notifications.admin.inc
@@ -165,6 +165,13 @@ function push_notifications_admin_form($form_state) {
     '#default_value' => variable_get('push_notifications_apns_passphrase', ''),
   );
 
+  $form['configuration_apns']['push_notifications_apns_certificate_folder'] = array(
+    '#type' => 'textfield',
+    '#title' => t('APNS Certificate Folder Path'),
+    '#description' => t('If you want to store your certificates in a different directory than the modules default (the \'certificates\' folder inside this module\'s folder), specify the path here. If you use your own path, use the full path, e.g. \'/users/danny/drupal_install/certificates/\', not the relative path. Otherwise, leave this field blank.'),
+    '#default_value' => variable_get('push_notifications_apns_certificate_folder', ''),
+  );
+
   $form['configuration_c2dm'] = array(
     '#type' => 'fieldset',
     '#title' => t('Google Push Notifications'),
@@ -267,6 +274,27 @@ function push_notifications_admin_form_submit($form, &$form_state) {
   // Set GCM API key.
   variable_set('push_notifications_gcm_api_key', $form_state['values']['push_notifications_gcm_api_key']);
 
+  // Set the APNS certificate location.
+  $apns_cert_folder = $form_state['values']['push_notifications_apns_certificate_folder'];
+  if (!empty($apns_cert_folder)) {
+
+    // Add a trailing slash if not present.
+    if ($apns_cert_folder[strlen($apns_cert_folder) - 1] != DIRECTORY_SEPARATOR) {
+      $apns_cert_folder .= DIRECTORY_SEPARATOR;
+    }
+
+    variable_set('push_notifications_apns_certificate_folder', $apns_cert_folder);
+    $apns_cert = _push_notifications_get_apns_certificate();
+    if (!file_exists($apns_cert)) {
+      drupal_set_message(t('Could not find any APNS certificates at @path. Please ensure your certificates are located in the correct folder to send push notifications.', array('@path' => $apns_cert)), 'warning');
+    }
+  }
+  // Remove the variable if the location field is blank
+  // but a variable had been set previously.
+  else if (variable_get('push_notifications_apns_certificate_folder', NULL)) {
+    variable_del('push_notifications_apns_certificate_folder');
+  }
+
   // Set the APNS pem file passphrase.
   variable_set('push_notifications_apns_passphrase', $form_state['values']['passphrase']);
 
diff --git a/push_notifications.module b/push_notifications.module
index 7e9d79d37d062fbfbf8a0d6ae761beb7597f4e33..c943290387a15811acc15f8a6291b2167cf39fd9 100644
--- a/push_notifications.module
+++ b/push_notifications.module
@@ -335,7 +335,7 @@ function push_notifications_store_token($token = '', $type_id = '', $uid = '', $
 function push_notifications_open_apns() {
   // Determine the absolute path of the certificate.
   // @see http://stackoverflow.com/questions/809682
-  $apns_cert = dirname(__FILE__) . '/certificates/' . PUSH_NOTIFICATIONS_APNS_CERTIFICATE;
+  $apns_cert = _push_notifications_get_apns_certificate();
 
   // Create a stream context.
   $stream_context = stream_context_create();
@@ -922,7 +922,7 @@ function push_notifications_purge_token($token = '') {
 function push_notifications_apns_feedback_service() {
   // Create a Stream context and open an Internet socket connection.
   $stream_context = stream_context_create();
-  $apns_cert = dirname(__FILE__) . '/certificates/' . PUSH_NOTIFICATIONS_APNS_CERTIFICATE;
+  $apns_cert = _push_notifications_get_apns_certificate();
   stream_context_set_option($stream_context, 'ssl', 'local_cert', $apns_cert);
   $apns = stream_socket_client('ssl://' . PUSH_NOTIFICATIONS_APNS_FEEDBACK_HOST . ':' . PUSH_NOTIFICATIONS_APNS_FEEDBACK_PORT, $error, $error_string, 2, STREAM_CLIENT_CONNECT, $stream_context);
   if (!$apns) {
@@ -957,3 +957,25 @@ function push_notifications_apns_feedback_service() {
   watchdog('push_notifications', '!count were removed after pulling the Apple feedback service.', array('!count' => $counter));
 
 }
+
+/**
+ * Get the full path to the APNS certificate.
+ *
+ * @return string
+ *   The path to the certificate file on the server.
+ */
+function _push_notifications_get_apns_certificate() {
+  $path = variable_get('push_notifications_apns_certificate_folder', '');
+
+  if (empty($path)) {
+    $path = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'certificates' . DIRECTORY_SEPARATOR;
+  }
+
+  $path .= PUSH_NOTIFICATIONS_APNS_CERTIFICATE;
+
+  if (!file_exists($path)) {
+    watchdog('push_notifications', 'Cannot find apns certificate file at @path', array('@path' => $path), WATCHDOG_WARNING, l(t('settings'), 'admin/config/services/push_notifications/configure'));
+  }
+
+  return $path;
+}
