कनेक्शन Java-MySql: सार्वजनिक कुंजी पुनर्प्राप्ति की अनुमति नहीं है


109

मैं कनेक्टर 8.0.11 का उपयोग करके जावा के साथ MySql डेटाबेस को जोड़ने का प्रयास करता हूं। सब कुछ ठीक लगता है, लेकिन मेरे पास यह अपवाद है:

थ्रेड में अपवाद "मुख्य" java.sql.SQLNonTransientConnectionException: सार्वजनिक कुंजी पुनर्प्राप्ति की अनुमति नहीं है

स्टैक ट्रेस:

    Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at 
 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:438) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:146) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:119) at ConnectionManager.getConnection(ConnectionManager.java:28) at Main.main(Main.java:8)

कनेक्टर प्रबंधक:

public class ConnectionManager {

    public static final String serverTimeZone = "UTC";
    public static final String serverName = "localhost";
    public static final String databaseName ="biblioteka";
    public static final int portNumber = 3306;
    public static final String user = "anyroot";
    public static final String password = "anyroot";

    public static Connection getConnection() throws SQLException {

        MysqlDataSource dataSource = new MysqlDataSource();

        dataSource.setUseSSL( false );
        dataSource.setServerTimezone( serverTimeZone );
        dataSource.setServerName( serverName );
        dataSource.setDatabaseName( databaseName );
        dataSource.setPortNumber( portNumber );
        dataSource.setUser( user );
        dataSource.setPassword( password );

        return dataSource.getConnection();
    }
}

1
कृपया, कुछ कोड प्रदान करें: आप कैसे कनेक्ट करने का प्रयास कर रहे हैं। अपवाद का स्टैक ट्रेस भी उपयोगी होगा।
सर्गेई सिरिक

जवाबों:


241

आपको allowPublicKeyRetrieval=trueक्लाइंट को सर्वर से सार्वजनिक कुंजी को स्वचालित रूप से अनुरोध करने की अनुमति देने के लिए अपने mysql-कनेक्टर में क्लाइंट विकल्प जोड़ना चाहिए । ध्यान दें कि AllowPublicKeyRetrieval=Trueएक दुर्भावनापूर्ण प्रॉक्सी को प्लेनटेक्स्ट पासवर्ड प्राप्त करने के लिए एक MITM हमला करने की अनुमति दे सकता है, इसलिए यह डिफ़ॉल्ट रूप से गलत है और स्पष्ट रूप से सक्षम होना चाहिए।

https://mysql-net.github.io/MySqlConnector/connection-options/

useSSL=falseजब आप इसका उपयोग परीक्षण / विकास के उद्देश्य से करने का प्रयास कर सकते हैं

उदाहरण:

jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false

1
ठीक है, यह मेरे लिए काम करता है लेकिन मुझे यकीन नहीं है कि ये विकल्प सुरक्षा के दृष्टिकोण से कितने वैध हैं।
प्रियांक ठक्कर

30
useSSL=false&allowPublicKeyRetrieval=trueमैं क्या जरूरत है केवल जब मैं से जोड़ने की कोशिश की है docker_container1करने के लिए docker_container2_mysql(where mysql is installed)अपने स्थानीय मेजबान के भीतर। जबकि मेरे मेजबान मशीन से docker_container2_mysql, के useSSL=falseलिए पर्याप्त है।
प्रयागपाद जू

1
allowPublicKeyRetrieval = true & amp; उपयोग करेंSSSSL = false, टैंक आप इसे काम करता है
मार्टिन क्लेस्टिल

2
क्या आप बता सकते हैं कि ऐसा क्यों है?
कैपन स्पैरो

मेरे JDBC कनेक्शन स्ट्रिंग में 'allowPublicKeyRetrieval = true' को जोड़ने के बाद कल विंडोज 10 के बाद मेरी विकास प्रणाली की समस्या हल हो गई। लगता है कि Microsoft ने एक और छेद प्लग किया, और विकल्प का उपयोग "केवल विकास के लिए" मेरे विचार में किया जाना चाहिए, जहां एसएसएल चालू नहीं है।
Alz

30

निम्नानुसार उपयोग करें jdbc url:

jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;

PortNo: 3306 आपके विन्यास में अलग हो सकता है


यहां एक छोटा सुधार। कनेक्शन प्रॉपर्टी 'यूएसएसएलएल' स्वीकार्य मूल्य हैं: 'ट्रू', 'एफएलएसई', 'यस' या 'नो'। मान 'झूठा?' स्वीकार्य नहीं है।
ब्ल्युलेकर

27

के लिए DBeaver उपयोगकर्ताओं:

  1. अपने कनेक्शन पर राइट क्लिक करें, "कनेक्शन संपादित करें" चुनें

  2. "कनेक्शन सेटिंग्स" स्क्रीन (मुख्य स्क्रीन) पर "ड्राइवर सेटिंग संपादित करें" पर क्लिक करें

  3. "कनेक्शन गुण" पर क्लिक करें

  4. "उपयोगकर्ता गुण" क्षेत्र पर राइट क्लिक करें और "नई संपत्ति जोड़ें" चुनें

  5. दो गुण जोड़ें: "SSSSL का उपयोग करें "और" allowPublicKeyRetrieval "

  6. "वैल्यू" कॉलम पर डबल क्लिक करके उनके मानों को "झूठे" और "सच" पर सेट करें


11

सुझाव उत्तर देने के लिए वैकल्पिक रूप से आप कोशिश करते हैं और इस्तेमाल कर सकते हैं mysql_native_password प्रमाणीकरण के बजाय प्लगइन caching_sha2_password प्रमाणीकरण प्लगइन।

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here'; 

4

मैं स्प्रिंग बूट ढांचे पर नीचे विन्यास का उपयोग करके इस मुद्दे को हल करता हूं

spring.datasource.url=jdbc:mysql://localhost:3306/db-name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

1

मेरे मामले में यह उपयोगकर्ता की त्रुटि थी। मैं rootएक अमान्य पासवर्ड के साथ उपयोगकर्ता का उपयोग कर रहा था । मुझे यकीन नहीं है कि मुझे एक त्रुटि क्यों नहीं मिली, बल्कि इस गुप्त संदेश को प्राप्त किया।


1

मेरे मामले में उपरोक्त त्रुटि वास्तव में गलत उपयोगकर्ता नाम और पासवर्ड के कारण थी। समस्या का हल: 1. लाइन पर जाएं DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "उपयोगकर्ता नाम", "पासवर्ड"); फ़ील्ड उपयोगकर्ता नाम और पासवर्ड गलत हो सकता है। उपयोगकर्ता नाम और पासवर्ड दर्ज करें जिसका उपयोग आप अपने mysql क्लाइंट को शुरू करने के लिए करते हैं। उपयोगकर्ता नाम आम तौर पर रूट और पासवर्ड वह स्ट्रिंग है जो आप तब दर्ज करते हैं जब इसके समान स्क्रीन mysql की स्टार्टअप स्क्रीन दिखाई देती है

नोट: portname 3306 आपके मामले में भिन्न हो सकता है।


1

मैंने इस मुद्दे को निराशाजनक पाया क्योंकि मैं कल डेटाबेस के साथ बातचीत करने में सक्षम था, लेकिन आज सुबह वापस आने के बाद, मुझे यह त्रुटि मिलने लगी।

मैंने allowPublicKeyRetrieval=trueध्वज जोड़ने की कोशिश की , लेकिन मुझे त्रुटि मिलती रही।

यह मेरे लिए क्या तय किया गया था Project->Cleanग्रहण में और Cleanमेरे टॉमकैट सर्वर पर। उनमें से एक (या दोनों) ने इसे तय किया।

मुझे समझ नहीं आ रहा है, क्योंकि मैं मावेन का उपयोग करके अपनी परियोजना का निर्माण करता हूं, और प्रत्येक कोड परिवर्तन के बाद अपने सर्वर को फिर से शुरू कर रहा हूं। बहुत परेशान ...


1

Mysql के साथ स्प्रिंग बूट एप्लिकेशन कनेक्शन में प्रयोग करें।

jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC

1

हमारे मौजूदा एप्लिकेशन को डॉक्यूमेंट करते समय मैं भी इस तरह के मुद्दे का सामना कर रहा था। JDBC कनेक्शन स्ट्रिंग के लिए सही के मान के साथ MySQL के allowPublicKeyRetrieval कनेक्शन विकल्प जोड़ने के लिए समाधान si । यदि यह काम नहीं कर रहा, जोड़ने का प्रयास करें useSSL करने का विकल्प झूठे के रूप में अच्छी तरह से।

परिणामी स्ट्रिंग इस तरह दिखेगा:

jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false

0

यह समाधान MacOS Sierra के लिए काम करता है, और MySQL संस्करण 8.0.11 चला रहा है। कृपया सुनिश्चित करें कि आपने अपने बिल्ड पथ में जो ड्राइवर जोड़ा है - "बाहरी जार जोड़ें" को SQL संस्करण के साथ मेल खाना चाहिए।

String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";

0

कनेक्शन URL को jdbc के रूप में दें: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC


0

यदि आपको mysql को कनेक्ट करते समय निम्नलिखित त्रुटि हो रही है (या तो mysql चलाने वाले स्थानीय या mysql कंटेनर):

java.sql.SQLNonTransientConnectionException: सार्वजनिक कुंजी पुनर्प्राप्ति की अनुमति नहीं है

समाधान: अपनी डेटाबेस सेवा में निम्नलिखित पंक्ति जोड़ें:

command: --default-authentication-plugin=mysql_native_password

0

सबसे पहले, कृपया सुनिश्चित करें कि आपका डेटाबेस सर्वर ऊपर और चल रहा है। मुझे वही त्रुटि मिल रही थी, यहाँ सूचीबद्ध सभी उत्तरों की कोशिश करने के बाद मुझे पता चला कि मेरा डेटाबेस सर्वर नहीं चल रहा था।

आप MySQL Workbench, या कमांड लाइन का उपयोग करके इसे देख सकते हैं

mysql -u USERNAME -p

यह स्पष्ट लगता है, लेकिन कई बार हम मानते हैं कि डेटाबेस सर्वर हर समय चालू रहता है, खासकर जब हम अपने स्थानीय मशीन पर काम कर रहे होते हैं, जब हम मशीन को पुनरारंभ / बंद करते हैं, तो डेटाबेस सर्वर स्वतः बंद हो जाएगा।


0

यह गलत उपयोगकर्ता नाम या पासवर्ड के कारण भी हो सकता है। समाधान के रूप में मैंने allowPublicKeyRetrieval=true&useSSL=falseभाग जोड़ा है, लेकिन फिर भी मुझे त्रुटि मिली तो मैंने पासवर्ड की जाँच की और यह गलत था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.